类属性、实例属性

它们在定义和使用有所区别,而最本质的区别是内存中保存的位置不同。
- 实例属性属于对象
- 类属性属于类

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/