Python基础20-面向对象(属性限制-只读优化)

Python基础-面向对象(属性限制)

1 通过 __setattr__方法过滤

1.1 python中没有完全的只读属性,因为可以通过以下方式进行赋值

p._Person__age = 10
或
p.__dict__['_Person__age'] = 10

1.2 限制通过点语法修改属性,至少将下面方式屏蔽掉

p._Person__age = 10

1.3 通过对 __setattr__方法进行拦截操作,优化只读属性

class Person:
    # 当我们通过 "实例.属性 = 值", 给一个实例增加一个属性, 或者说, 修改一下属性值的时候, 都会调用这个__setattr__方法
    # 在__setattr__方法内部才会真正的把属性, 以及对应的数据, 给存储到__dict__字典里面
    def __setattr__(self, key, value):
        print(key, value)

        # 1. 判定, key, 是否是我们要设置的只读属性的名称
        if key == "age" and key in self.__dict__.keys():
            print("这个属性是只读属性, 不能设置数据")
        # 2. 如果说不是, 只读属性的名称, 真正的给它添加到这个实例里面去
        else:
            # self.key = value
            self.__dict__[key] = value
p = Person()
p.age = 18
print(p.age)


p.age = 999
print(p.age)

print(p.__dict__)

>>> 打印结果
age 18
18
age 999
这个属性是只读属性, 不能设置数据
18
{'age': 18}

注意:
目前,即使优化后不能通过“实例.属性 = 值”方式进行属性修改,但是如果外界通过p.__dict__['_Person__age'] = 10 进行修改操作的话还是可以的

2 常见系统内置属性

  • 类属性

__module__:类定义所在的模块
__doc__:类的文档字符串
__name__:类名
__bases__:类的所有父类构成元组
__dict__:类的属性

  • 实例属性
    __class__:实例对应的类
    __dict__:实例的属性

你可能感兴趣的:(Python基础20-面向对象(属性限制-只读优化))