类属性、实例属性
它们在定义和使用有所区别,而最本质的区别是内存中保存的位置不同。
- 实例属性属于对象
- 类属性属于类
class Animal(object): #类属性 species = '哺乳动物' def __init__(self, name): # 实例属性 self.name = name def get_info(self): #定义实例方法,至少有一个 self 参数 print('我是', self.name) @classmethod def class_func(cls): #定义类方法,至少有一个 cls 参数 print('我是',cls.species) @staticmethod def static_func(): #定义静态方法,无默认参数 print('我是静态方法') # 创建一个实例对象 animal1 = Animal('老虎') #直接访问实例属性,通过实例对象访问 print(animal1.name) #直接访问类属性,通过类对象访问 print(Animal.species) #直接访问类属性,通过实例对象访问,animal1.species 等价 animal1.__class__.species print(animal1.species) # 创建另一个实例对象 animal2 = Animal('狮子') #调用实例方法 animal1.get_info() #调用类方法 Animal.class_func() #调用静态方法 Animal.static_func()
类属性保存在类空间里,类属性在内存中只保存一份,而实例属性在每个实例对象中都要保存一份。
当使用 animal = Animal('老虎')
创建一个实例对象时,会在内存中创建一个实例对象空间(通过调用 __new__
),之后调用 __init__
方法对该空间进行初始化,self 指向创建的实例对象空间。
实例方法、静态方法和类方法
实例方法、静态方法和类方法三种方法在内存中都属于类对象空间,均属于类,所以在内存中只保存一份(区别主要是调用方式不同)。
- 实例方法:由实例对象调用,至少有一个 self 参数,执行实例方法时,自动将调用该方法的实例对象赋值给 self
- 类方法:由类调用,至少一个 cls 参数,执行类方法时,自动将调用该方法的类对象赋值给 cls
- 静态方法: 由类调用,无默认参数
原创文章,转载请注明出处:https://www.daiyufish.com/article/python3-class/