python描述器

描述器在对象“."时即产生作用
1、类定义中既有__get__()由有__set__()函数时,返回__get__()函数的返回值

class D:
    def __get__(self, obj, objtype):
        return 'peter'


class A:
    d = D()

o = A()
o.d = 'bob'
D.__set__ = lambda x, y, z: None
o.d  # peter

2、如果类定义中不同时存在__get__()和__set__(),返回对象的__dict__中的属性值

class D:
    def __get__(self, obj, objtype):
        return 'peter'


class A:

    def __init__(self) -> None:
        self.d = 'bob'


o = A()
o.d  # bob

3、如果类定义中存在__get__(),对象字典中__dict__不存在所取的属性,则返回__get__()函数的返回值

class D:
    def __get__(self, obj, objtype):
        return 'peter'


class A:
    d = D()

o = A()
o.d  # peter

4、如果类定义中不存在__get__(),对象字典中__dict__不存在所取的属性,则在类的__dict__中找所取属性

class D:
    d = 'Alice'


class A(D):
    pass


o = A()
o.d  # Alice

4、class self的魔法
4.1、定义类的时候,A.dict__里面产生了f这个function,调用A.f的时候,由于A中不同时定义__get__和__set,通过__dict__返回f这个function。
4.2、调用o.f的时候,由于o不是描述器且__dict__中不存在f这个属性,从A的__dict__中去拿f,由于f是一个描述器,f的描述器返回绑定了o这个对象的method。

class A:
    def f(self, data):
        print(self.name)
        print(data)


o = A()
o.name = 'Bob'

A.f  # <function __main__.A.f(self, data)>
o.f  # <bound method A.f of <__main__.A object at 0x7ea9e6e03350>>

例1、

class FuncDescr:
    def __get__(self, *args):
        def f(self, data):
            print(self.name)
            print(data)

        return f


class A:
    f = FuncDescr()


o = A()
o.name = 'bob'
o.f(o, 'hello')
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值