Python类属性、类方法和静态方法

2021-02-26 14:50:16 浏览数 (1)

在Python中,一切皆对象。通过类创建出来的对象是实例对象,类本身也是对象,称为类对象。

一、类属性

对象都有属性,我们常说的对象属性是实例对象拥有的属性,又称为实例属性。

类对象所拥有的属性叫类属性,它被该类的所有实例对象所共有。类属性可以使用类对象或实例对象访问。

代码语言:javascript复制
class House(object):
 
    price = 'high'
 
 
print(House.price)
h = House()
print(h.price)
 
House.price = 'too high'
print(House.price)
print(h.price)
 
print('-' * 20)
h.price = 'high'
print(House.price)
print(h.price)

运行结果:

代码语言:javascript复制
high
high
too high
too high
--------------------
too high
high

类属性的定义方法是直接在类中定义一个属性,这样定义的属性就是类属性。

不管是通过实例对象还是通过类对象,获取到的类属性都是一样的。所以,当类的实例对象所记录的某项数据始终保持一致时,则可以将该属性定义成类属性。

可以通过类对象来修改类属性,但是不可以通过实例对象来修改类属性。用实例对象来修改类属性时不会报错,因为这时候其实是给类的实例对象定义了一个与类属性同名的实例属性。

在使用过程中,我们要尽量避免类属性和实例属性同名。如果有同名实例属性,实例对象会优先访问实例属性。

补充:

1.类属性也可以设置为私有,前边添加两个下划线。

2.实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有 ,仅占用一份内存,更加节省内存空间。

二、类方法

与类属性类似,类对象所拥有的方法叫类方法。

类方法一般和类属性配合使用,当方法中需要使用类对象(如访问私有类属性等)时,定义类方法。

代码语言:javascript复制
class House(object):
 
    __price = 'high'
 
    @classmethod
    def get_price(cls):
        return cls.__price
 
 
print(House.get_price())
 
h = House()
print(h.get_price())

运行结果:

代码语言:javascript复制
high
high

定义类方法,需要用装饰器@classmethod来标识其为类方法,并且类方法的第一个参数必须是类对象,一般以cls作为第一个参数。否则,类方法就没有定义成功,无法通过类对象来使用该方法。

三、静态方法

在Python中,静态方法是既不需要传递类对象也不需要传递实例对象的方法。形参里没有self/cls,不会自动传递实例对象和类对象。

代码语言:javascript复制
class House(object):
 
    __price = 'high'
 
    @classmethod
    def get_price(cls):
        return cls.__price
 
    @staticmethod
    def description():
        return 'No money, no house'
 
 
print(House.description())
 
h = House()
print(h.description())

运行结果:

代码语言:javascript复制
No money, no house
No money, no house

与定义类方法的方式相同,定义静态方法需要通过装饰器@staticmethod 来进行修饰。

实例对象和类对象都可以访问静态方法。

当方法中既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象 (如类属性、类方法、创建实例等)时,可以将方法定义成静态方法。

补充:

1.静态方法取消了不需要的参数传递,有利于减少不必要的内存占用和性能消耗。

2.类中定义了同名的对象方法、类方法、静态方法时,调用方法会优先执行最后定义的方法。

0 人点赞