Python--28 描述符(preperty的原理)

描述符

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

  特殊类型就是实现以下三个方法的一个或多个

    __get__(self, instance, owener)

     用于访问属性,它的返回属性的值

    __set__(self, instance, value)

     将在属性分配操作中调用,不返回任何内容

    __delete__(self, instance)

      控制删除操作,不返回任何内容

property就是一个描述符类

>>> 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 0x7f43e3b3efd0> <__main__.Test object at 0x7f43e3b52048> <class ‘__main__.Test‘>
>>> test
<__main__.Test object at 0x7f43e3b52048>
>>> test.x = ‘X-man‘
setting... <__main__.MyDecriptor object at 0x7f43e3b3efd0> <__main__.Test object at 0x7f43e3b52048> X-man
>>> del test.x
deleting... <__main__.MyDecriptor object at 0x7f43e3b3efd0> <__main__.Test object at 0x7f43e3b52048>

property的实现原理

>>> class Myproperty:
...     def __init__(self,fget = None, fset = None, fdel = None):
...         self.fget = fget
...         self.fset = fset
...         self.fdel = fdel
...     def __get__(self,instance,owener):
...         return self.fget(instance)
...     def __set__(self,instance,value):
...         self.fset(instance,value)
...     def __del__(self,instance):
...         self.fdel(instance)
...
>>> class C:
...     def __init__(self):
...         self.x = None
...     def getX(self):
...         return self.x
...     def setX(self,value):
...         self.x = value
...
>>> c =C()
>>> c.x = ‘C-man‘
>>> c.x
‘C-man‘
>>> del c.x

练习要求

  先定义一个温度类,然后定义两个描述符类用于描述摄氏度和华氏度两个属性。

  要求两个属性会自动转换,也就是说你可以给摄氏度这个属性赋值,然后打印的华氏度属性是自动转换后的结果

>>> class Celsius:
...     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 = value
...
>>> class Fahrenheit:
...     def __get__(self,instance,owner):
...         return instance.cel *1.8 +32
...     def __set__(self,instance,value):
...         instance.cel = (float(value) - 32)/1.8
...
>>> class Temperarure:
...     cel = Celsius()
...     fah = Fahrenheit()
...
>>> temp = Temperarure()
>>> temp.cel
26.0
>>> temp.cel = 30
>>> temp.fah
86.0
>>> temp.fah =100
>>> temp.cel
37.77777777777778
时间: 2024-08-09 18:39:13

Python--28 描述符(preperty的原理)的相关文章

python之描述符

描述符是将某种特殊类型的类实例指派给另一个类的属性,某种特殊类型的类就是这个类里面封装了get,set,delete这三个方法,可以将这个类指派给另一个类的某一个属性,这样就可以通过这三个方法对该属性进行操作,举例如下 1 class MyDecriptor: 2 def __set__(self,instance,value): 3 print('set') 4 def __get__(self,instance,owner): 5 print('get') 6 def __delete__(

python Descriptor (描述符)

简介: python 描述符是新式类(继承自object)中的语言协议,基于描述符可以提供更佳优雅的解决方案. python的classmethod, staticmethod, property都是基于描述符建立的. 描述符的协议: 定义了__set__, __get__, __delete__3个方法中任何一个方法的object可以作为描述符. 描述符分类: 同时定义了__set__,__get__被叫做data descriptor. 只定义了__get__被叫做no-data descr

Python属性描述符(一)

描述符是对多个属性运用相同存取逻辑的一种方式,,是实现了特性协议的类,这个协议包括了__get__.__set__和__delete__方法.property类实现了完整的描述符协议.通常,可以只实现部分协议,如只实现了__get__或__set__,而不必把__get__.__set__和__delete__全部实现 现在,让我们用描述符协议升级上一个章节Python动态属性和特性(二)的LineItem类 图1-1 我们将定义一个Quantity类,LineItem类会用到两个Quantit

Python属性描述符(二)

Python存取属性的方式特别不对等,通过实例读取属性时,通常返回的是实例中定义的属性,但如果实例未曾定义过该属性,就会获取类属性,而为实例的属性赋值时,通常会在实例中创建属性,而不会影响到类本身.这种不对等的方式对描述符类也有影响. def cls_name(obj_or_cls): # 传入一个实例,返回类名 cls = type(obj_or_cls) if cls is type: cls = obj_or_cls return cls.__name__.split('.')[-1] d

python 属性描述符及属性查找顺序

1 import numbers 2 class IntField: # 当一个类实现了 __get__, __set__, __delete__ 3 """ 4 数据描述符 5 """ 6 def __get__(self, instance, owner): 7 return self.value 8 def __set__(self, instance, value): 9 if not isinstance(value, numbers.

Python进阶-----描述符(__get__(),__set__(),__delete__())

一.描述符是什么 描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议 __get__():调用一个属性时,触发 __set__():为一个属性赋值时,触发 __delete__():采用del删除属性时,触发 1 class Foo: #在python3中Foo是新式类,它实现了三种方法,这个类就被称作一个描述符 2 def __get__(self, instance, owner): 3 prin

python tips:描述符descriptor

描述符(descriptor)是实现了__get__.__set__.__del__方法的类,进一步可以细分为两类: 数据描述符:实现了__get__和__set__ 非数据描述符:没有实现__set__ 描述符在类的属性调用中起着很重要的作用,类在调用属性时,遵守两个规则: 按照实例属性.类属性的顺序选择属性,即实例属性优先于类属性 如果在类属性中发现同名的数据描述符,那么该描述符会优先于实例属性 非数据描述符会被实例属性覆盖 class A: def __get__(self, obj, c

[TimLinux] Python 自定义描述符

1. 含义 在类中,含有属性(该属性需要存在类对象到__dict__属性中,不能为存在示例对象的__dict__属性中),对属性对操作(访问,设置值,删除)可以自定义行为,这样对自定义行为成为自定义属性描述符(Descriptor),这样的属性对象来自相应对类,这样的类称为描述符类. 2. 结构 class A(object): pass # 实现任一一个或多个:__get__, __set__, __delete__, __set_name__ # 类A称为描述符类 class T(objec

python之描述符的应用

class Foo: def __init__(self,key,hope_type): self.key=key self.hope_type=hope_type def __get__(self, instance, owner): print('输出get') return instance.__dict__[self.key] def __delete__(self, instance): print('输出delete') instance.__dict__.pop(self.key)