立即登录

注册账号

联系我们

2021年12月22日 19:13

10.1 类属性与对象属性

类的属性和对象的属性
定义在类中(而不是初始化中的属性)称为类属性
类属性通过 类名.属性 来调用,所有的对象公用的.
在所有的对象中也能调用,通过 对象.属性 调用的属于对象自身.
在对象初始化时, 调用公共的类属性,来赋值自身的对象属性.

class Cat:
    count = 0
    def __init__(self,name,color):
        self.name = name
        self.color = color
xh = Cat('小黑','黑色')
xh.count = 3
Cat.count = 5
xb = Cat('小白','白色')
xb.count  # 输入为3而不是5,改变类属性并不能改变对象的属性.

在初始化方法中, 可以改变类属性, 实现一个对象计数的功能,每增加一个实例化对象,count就会加1

class Cat:
    count = 0
    def __init__(self,name,color):
        self.name = name
        self.color = color
        Cat.count += 1
xh = Cat('小黑','黑色')
print(xh.count) # 输出1
print(Cat.count) # 输出1
xb = Cat('小白','白色')
print(Cat.count) # 输出2
print(xb.count) # 输出2

类的私有属性, 将类属性定义为私有

只能在类的内部调用,
定义的方法是在属性前加__(注意:两个下划线)
可以通过内部再定义一个方法,来调用私有属性
通过以上两步,使对象的私有属性变为不能修改,且只能通过方法来调用.

class Cat:
    __count = 0
    def __init__(self,name,color):
        self.name = name
        self.color = color
        Cat.__count += 1

    def count(self):
        return self.__count
xh = Cat('小黑','黑色')
print(xh.count()) # 通过对象的方法调用
# print(xb.__count) # 不能通过对象的属性调用,避免了通过对象修改.

以上还可以增加@property装饰器,使方法的调用类似属性

class Cat:
    __count = 0
    def __init__(self,name,color):
        self.name = name
        self.color = color
        Cat.__count += 1

    @property    
    def count(self):
        return self.__count
xh = Cat('小黑','黑色')
print(xh.count) # 在别人看来,好像调用一个属性,其实是一个方法
xh.count = 4 # 由于是方法,所以不能像属性一样去修改,报错

 

留言

给我留言