一、定义
(1)描述符:将某种特殊类型的类的实例指派给另一个类的属性
(2)特殊类:至少在类里定义__get__()
、__set__()
或者__delete__
三个特殊方法中的任意一个
(3)相关魔法方法
魔法方法 | 含义 |
---|---|
__get__(self, instance, owner) | 用于访问属性,它返回属性的值 |
__set__(self, instance, value) | 将在属性分配操作中调用,不返回任何内容 |
__delete__(self, instance) | 控制删除操作,不返回任何内容 |
(4)property 的使用
二、示例
- 示例 1
class MyDescriptor:
# self:描述符类本身实例(MyDescriptor)
# instance:(test)拥有者本身的实例;owner:(Test)
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('deletting',self,instance)
class Test:
# MyDescriptor是x的描述符
x = MyDescriptor()
这里由于MyDescriptior实现了__get__()、__set__()
和__delete__()
方法,并且将它的类示例指派给Test类的属性,所以MyDescriptior就是所谓的描述类
例如当访问x属性时,Python会自动调用描述符__get__( )
方法,几个参数的内容:self 是描述符类自身的实例;instance是这个描述符的拥有者所在的类的实例,这里也就是Test类的实例;owner是这个描述符的拥有者所在的类本身。
- 示例 2
class MyProperty:
def __init__(self, fget=None, fset=None, fdel=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
def __get__(self, instance, owner):
return self.fget(instance)
def __set__(self, instance, value):
self.fset(instance, value)
def __delete__(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
def delX(self):
del self._x
# 下面的MyProperty与property等价,都是一个描述符
# 只不过MyProperty是自己定义的,而property是内置函数
x = MyProperty(getX,setX,delX)
# x = property(getX,setX,delX)
- 示例 3
定义一个温度类,然后定义两个描述符类用于描述摄氏度和华氏度两个属性,两个属性会自动进行转换,也就是,给摄氏度这个属性赋值,然后打印华氏度是自动转换后的结果。
#描述摄氏度
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 = float(value)
#描述华氏度
class Fahrenheit:
def __get__(self, instance, owner):
# 此时的instance指的就是Temperature
return instance.cel * 1.8 +32
def __set__(self, instance, value):
instance.cel = (float(value) - 32) /1.8
class Temperatue:
#实例化的对象,赋值给cel和fah
cel = Celsius()
fah = Fahrenheit()
4. 示例 4
class Rectangle:
def __init__(self):
self.width = 0
self.height = 0
def setSize(self,size):
self.width,self.height = size
def getSize(self):
return self.width,self.height
size = property(getSize,setSize)