美文网首页
01 python __get__方法

01 python __get__方法

作者: 阿登20 | 来源:发表于2021-04-24 02:06 被阅读0次

类当中有__get__被称作为描述符类,比如C类, C的实例化作为,其他类的(如C2)类属性时,当
调用类属性d时,会自动调用描述符类的__get__方法。

如下面的代码,请仔细看注释说明

class C(object):
    """
   存在了__get__的方法的类称之为描述符类
    descriptor 的实例自己访问自己是不会触发__get__,而会触发__call__,只有 descriptor 作为其它类的属性的时候才会触发 __get___
    """
    a = 'abc'

    def __get__(self, instance, owner):
        """

        @param instance: 被描述符的实例 C2的实例
        @param owner: 被秒速的类名C2
        @return:
        """
        print("__get__() is called", instance, owner)
        print(self) # self 传的是C 本身的实例
        g = instance.m #看看这里调用的是C2的类属性m, 赋值给g
        print(g)

        return self

    def bb(self):
        print("调用了 get")

class C2(object):
    # 为了使用一个描述器,需将这个描述器的实例作为类属性放到一个类的定义中.
    d = C()  # descriptor 的实例自己访问自己是不会触发__get__,而会触发__call__,只有 descriptor 作为其它类的属性的时候才会触发 __get___
    m=1

    def ren(self):
        self.d.bb() # self.d 会先去执行C类的__get__里面的代码返回C类的self self去调用C类里面的bb(),而并不是调用了C2自己的bb

    def bb(self):
        print("调用了CS的bb函数")

if __name__ == '__main__':
    # 当调用d 会自动去调用描述类C中的__get__
    C2().ren()

# __get__() is called <__main__.C2 object at 0x0000000014EC2FD0> <class '__main__.C2'>
# <__main__.C object at 0x0000000014EC2940>
# __get__() is called <__main__.C2 object at 0x0000000014EC2FD0> <class '__main__.C2'>
# <__main__.C object at 0x0000000014EC2940>
# 1
# __get__() is called None <class '__main__.C2'>
# <__main__.C object at 0x0000000014EC2940>
# 1
# 调用了 get


相关文章

网友评论

      本文标题:01 python __get__方法

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