类属性和实例化属性

类的构成包括成员属性和成员方法(数据成员和成员函数)
类的方法,有这么几个种:类方法、静态方法和实例方法。
类的属性也分为两种:一种是实例化属性,一种是类属性。

类的方法

类方法:

@classmethod # 类方法 需要cls参数,代表调用该函数的类.一般是用来访问类属性的

静态方法

@staticmethod # 静态方法:静态方法只在内存中生成一个,节省开销(也叫类的工具包)。

实例方法

def f3(self): # 实例方法需要self参数,代表调用该函数的实例

类属性

类属性对于所有的实例是公用的,与实例无关,一般定义在类中方法以外,当然类属性也可以定义在方法内的,
类属性是定义在类层面的,因此类属性要比实例属性作用域范围要广一些。

实例属性是与实例绑定的,只与实例有关,在类层次上是看不到的,

定义在类实例方法内。实例属性使用实例对象定义,而且对于每个实例化对象都是独立存在的。

在方法中定义的属性与方法外定义的属性略有不同。在方法外定义的类属性(count、lst),
只要类定义完成就已经生成;而在方法内定义的类属性,需要调用方法之后才会生成。也就是要实例化


使用类名称修改类属性

使用类名称修改类属性之后,不管用类名称还是实例名称调用类属性,
都是一样的,说明修改的的确是类属性。

使用类的实例化对象修改类属性

可变类型可修改,不可变类型不可修改

"""
类的构成包括成员属性和成员方法(数据成员和成员函数)
类的方法,有这么几个种:类方法、静态方法和实例方法。
类的属性也分为两种:一种是实例化属性,一种是类属性。
"""
 # 定义一个类
class MyClass:
    i = "MyClass类属性 i"
    def __init__(self):
        self.i='实例化属性 i'
    @classmethod # 类方法 需要cls参数,代表调用该函数的类.一般是用来访问类属性的
    def f1(cls):
        return cls.i
    @staticmethod # 静态方法:静态方法只在内存中生成一个,节省开销(也叫类的工具包)。
    def f2(i): 
        return i
    def f3(self): # 实例方法需要self参数,代表调用该函数的实例
        return self.i
# 定义另一个类
class b:
    i="class b 的类属性"
    def f1(self):
        return self.i
# 实例化类
x = MyClass() # 实例方法
# 方法调用效果
print("MyClass 类的方法 f1 输出为:", MyClass.f1())
print("MyClass 类的方法 f1 输出为:", x.f1())
print("MyClass 类的方法 f2 输出为:", MyClass.f2(2))
print("MyClass 类的方法 f2 输出为:", x.f2(5))
print("MyClass 类的方法 f3 输出为:", x.f3())
print("MyClass 类的方法 f3 输出为:", MyClass.f3(x))
# 鸭子类型的表现
print("MyClass 类的方法 f3 输出为:", MyClass.f3(b))
print("   b    类的方法 f1 输出为:", b.f1(MyClass)) 
print("   b    类的方法 f1 输出为:", b.f1(x)) 


# 类的属性
class C:
    """
    变量 x 和 words 是实例属性
    count、lst、say是类属性。
    """
    count=0
    lst=[1,2,3]
    def __init__(self, num = 0):
        self.x = num
        C.count += 1
        if C.count>3:
            C.say="好多实例对象啊!"
        else:
            C.say="实例对象好孤单啊!"
    def fprint(self,string):
        self.words=string
        print(self.words) 

# 实例属性是与实例绑定的,只与实例有关,在类层次上是看不到的,
# 定义在类实例方法内。实例属性使用实例对象定义,而且对于每个实例化对象都是独立存在的。
a = C(5)
a.x # 5
a.fprint("a说,我是第一个实例对象")
a.words

# 每个实例化对象的属性都是独立的
c = C()
c.x # 0
c.y =2
c.y # 2
# a.y # 'C' object has no attribute 'y'

# 类属性
"""
类属性对于所有的实例是公用的,与实例无关,一般定义在类中方法以外
当然类属性也可以定义在方法内的,
类属性是定义在类层面的,因此类属性要比实例属性作用域范围要广一些。
这里, count 和 lst 就是直接定义在类中方法以外的类属性,类属性通过类名调用。
"""
# 直接使用类名称调用类属性
C.lst # [1,2,3]
C.count # 3
C.say
print("实例调用与类名调用属性")
d = C(1) # # 实例化之后原来的属性值改变
d.say 
C.say
"""
   在方法中定义的属性与方法外定义的属性略有不同。在方法外定义的类属性(count、lst),
   只要类定义完成就已经生成;而在方法内定义的类属性,需要调用方法之后才会生成。也就是要实例化
"""

# 使用类名称修改类属性
"""
使用类名称修改类属性之后,不管用类名称还是实例名称调用类属性,
都是一样的,说明修改的的确是类属性。
"""
C.count = 9
c.lst[1] = 5
C.count
C.lst

# 使用类的实例化对象修改类属性
# 可变类型可修改,不可变类型不可修改

参考类属性(方法)和类实例化属性(方法)

posted @ 2021-08-04 19:15  索匣  阅读(573)  评论(0编辑  收藏  举报