美文网首页
Python基础20-面向对象(属性限制-只读优化)

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

作者: Jacob_LJ | 来源:发表于2018-05-20 11:17 被阅读14次

    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-面向对象(属性限制-只读优化)

          本文链接:https://www.haomeiwen.com/subject/ckgzdftx.html