Python描述符以及Property方法的实现原理

Python描述符以及Property方法的实现原理

描述符的定义:

描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
__get__():调用一个属性时,触发
__set__():为一个属性赋值时,触发
__delete__():采用del删除属性时,触发

描述符作用:

描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)

可以说成是属性的属性,定义属性的属性

描述符本身的实例并不会触发这三个方法

class dis:
    def __set__(self, instance, value):
        print('正在执行__set__方法.....')

    def __delete__(self, instance):
        print('正在执行__delete__方法')

    def __get__(self, instance, owner):
        print('正在执行__get__方法')


d = dis()
d.name = "1"
print(d.name)
del d.name

#================输出===================
1
描述符解析

分析代码

class dis:
    def __init__(self, fget, fset, fdel):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        print('正在执行__init__方法.....')

    def __set__(self, instance, value):
        print('正在执行__set__方法.....')
        print(instance, value)

    def __delete__(self, instance):
        print('正在执行__delete__方法')
        print(instance)

    def __get__(self, instance, owner):
        print('正在执行__get__方法')
        print(instance, owner)


class test:
    def __init__(self, value = 10):
        self.value = value
    def fset(self, value):
        self.value = value
    def fget(self):
        return self.value
    def fdel(self):
        del self.value

    x = dis(fget, fset, fdel)

t = test()
print(t.x)
t.x = 20
print(t.x)
del t.x

输出

正在执行__init__方法.....
正在执行__get__方法
<__main__.test object at 0x0000016CA299CEE0> <class '__main__.test'>
None
正在执行__set__方法.....
<__main__.test object at 0x0000016CA299CEE0> 20
正在执行__get__方法
<__main__.test object at 0x0000016CA299CEE0> <class '__main__.test'>
None
正在执行__delete__方法
<__main__.test object at 0x0000016CA299CEE0>

当test类试图去通过x属性来访问自身的value属性时,就会自动跳转到执行dis类里面的__get__方法。

当试图通过x去修改value的属性时就会执行dis类里面的__set__方法。

当试图通过x去删除value的属性时会执行dis类里面的__del__方法。

然后我把它们的参数类型打印出来可以知道;

instance参数指的是test类的实例化对象t;

owner指的是test类;

因为这几个方法我只是把值给打印出来,并未给出有效操作的代码,就返回值一直是None知道了上面之后我们可以实现property方法。

class dis:
    def __init__(self, fget = None, fset = None, fdel = None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel

    def __set__(self, instance, value):
        self.fset(instance, value)#这里fset的参数类型看test里面的fset就行,鸭子类型

    def __delete__(self, instance):
        self.fdel(instance)

    def __get__(self, instance, owner):
        return self.fget(instance)

以上大概就是property方法,然后再加上测试的代码

class test:
    def __init__(self, value = 10):
        self.value = value
    def fset(self, value):
        self.value = value
    def fget(self):
        return self.value
    def fdel(self):
        del self.value

    x = dis(fget, fset, fdel)

t = test()
print(t.x)
t.x = 20
print(t.x)
del t.x
try:
    print(t.x)
except AttributeError as reason:
    print("出错啦"+str(reason))

这里是输出结果:

10
20
出错啦'test' object has no attribute 'value'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
描述符是可以实现大部分Python类特性中的底层魔法,包括@classmethod、@staticmethod、@property甚至是__slot__属性。它们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被Python所调用,你可以定义自己想要的行为,而这一切都是自动发生的。其中一些常用的描述符魔术方法包括: 1. `__get__(self, instance, owner)`: 当通过实例访问描述符属性时触发的方法。`instance`是实例对象,`owner`是拥有描述符的类。 2. `__set__(self, instance, value)`: 当设置描述符属性的值时触发的方法。`instance`是实例对象,`value`是要设置的值。 3. `__delete__(self, instance)`: 当删除描述符属性时触发的方法。`instance`是实例对象。 4. `__getattribute__(self, instance)`: 当通过实例访问任何属性时触发的方法,包括描述符属性和普通属性。 5. `__setattribute__(self, instance, value)`: 当设置任何属性的值时触发的方法,包括描述符属性和普通属性。 这些描述符魔术方法可以让你在访问、设置和删除属性时进行自定义操作,从而更灵活地控制属性的行为。例如,如果你实现了`__get__`方法,则可以在实例访问描述符属性时自定义返回的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python高级(描述符相关的魔术方法)](https://blog.csdn.net/jamfiy/article/details/88050943)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【python】魔法算法详解](https://blog.csdn.net/weixin_34133829/article/details/89058418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值