Python学习,小甲鱼046魔法方法:描述符(Property 的原理)

本文深入探讨Python中描述符的使用,包括自定义描述符类实现__get__、__set__、__delete__方法,以及如何利用property()简化属性管理。通过具体示例展示描述符在类属性管理中的强大功能。
部署运行你感兴趣的模型镜像

描述符:将某种特殊类型的类的实例,指派给另一个类的属性。

 

描述符属性方法:

__get__(self, instance, owner)用于访问属性,它返回属性的值
__set__ (self, instance, value)将在属性分配操作中调用,不返回任何内容
__delete__ (self, instance)控制删除操作,不返回任何内容

 

instance指的就是另一个类的实例对象。

owner指的就是另一个类的类本身。

value指的是实例对象的值。

 

1. 使用类创建描述符

将描述性类MyDecriptor,指派给Test的属性

>>> class MyDecriptor:
	def __get__(self , instance, owner):
		print("getting……", self, instance, owner)
		
	def __set__(self , instance, value):
		print("setting……", self, instance, value)
		
	def __delete__(self, instance):
		print("deleting……", self, instance)

	
>>> class Test:
	x = MyDecriptor()

 

输出结果

>>> test = Test()
>>> test.x
getting…… <__main__.MyDecriptor object at 0x0000021464A0DA58> <__main__.Test object at 0x00000214648D2860> <class '__main__.Test'>
>>> test.x = 'lalala'
setting…… <__main__.MyDecriptor object at 0x0000021464A0DA58> <__main__.Test object at 0x00000214648D2860> lalala
>>> del test.x
deleting…… <__main__.MyDecriptor object at 0x0000021464A0DA58> <__main__.Test object at 0x00000214648D2860>

test.x 就是取值操作,使用的是“__get__”函数。返回值包括MyDecriptor类实例对象,Test的实例对象test以及所属的类。
 
test.x = 'lalala' 是赋值操作,使用的是“__set__”函数,返回值包括MyDecriptor类实例对象,Test的实例对象test以及被赋予的值。

 del test.x 就是删除操作

 

例题:

class C:
    def __init__(self, value = 26.0):
        self.value = float(value)

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

    def __set__(self, instance, value):
        self.value = float(value)

class F:

#  instance是指的下面的类里面的实例
    def __get__(self, instance, owner):
        return instance.c * 1.8 + 32

    def __set__(self, instance, value):
        instance.c = (float(value) - 32) /1.8


class Test:
    c = C()
    f = F()

 

测试:

>>> t1 = Test()
>>> t1.c = 100
>>> t1.f
212.0
>>> t1.c = 30
>>> t1.f
86.0
>>> t1.f = 100
>>> t1.c
37.77777777777778


 

 2. 使用属性类型创建描述符

还可以使用属性类型的方法。通过使用 property(),可以轻松地为任意属性创建可用的描述符。创建 property() 的语法是 property(fget=None, fset=None, fdel=None, doc=None),其中:

  • fget:属性获取方法
  • fset:属性设置方法
  • fdel:属性删除方法
  • doc:docstring
class Person(object):
    def __init__(self):
        self._name = ''
 
    def fget(self):
        print ("Getting: %s" % self._name)
        return self._name
     
    def fset(self, value):
        print ("Setting: %s" % value)
        self._name = value.title()
 
    def fdel(self):
        print ("Deleting: %s" %self._name)
        del self._name
    name = property(fget, fset, fdel, "I'm the property.")

 

测试之后:

>>> p = Person()
>>> p.name = 'haha'
Setting: haha
>>> p.name
Getting: Haha
'Haha'
>>> del p.name
Deleting: Haha

(可以理解为使用“name”封装了“_name”等方法)

 

 

 

 

 

 

 

 

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值