Python 描述器

2018-11-29  本文已影响0人  noteby

描述器

定义了__get____set__方法的描述器称为数据描述器
只定义了__get__的描述器称为非数据描述器

二者区别:当属性名和描述器名相同时,在访问这个同名属性时,如果是数据描述器就会先访问描述器,如果是非数据描述器就会先访问属性。

如下:

class A:
    def __init__(self, a=1):
        self.a = a

    def __get__(self, instance, owner):
        print('get from A')
        return self.a

    def __set__(self, instance, value):
        print('set from A')
        self.a = value

    def __delete__(self, instance):
        print('del from A')


class B:
    """
    非资料描述器
    """

    def __init__(self, b=2):
        self.b = b

    def __get__(self, instance, owner):
        print('get from B')
        return self.b


class Test:
    a = A()
    b = B()

    def __init__(self, a, b):
        self.a = a
        self.b = b


print(Test.a)  # 1
print(Test.b)  # 2

t = Test(0, 9)

print(t.a)  # 0
print(t.b)  # 9

print(Test.a)  # 0
print(Test.b)  # 2

print(t.__dict__)  # {'b': 9}

del Test.a
print(Test.a)   # AttributeError: type object 'Test' has no attribute 'a'
上一篇 下一篇

猜你喜欢

热点阅读