python-类-魔法方法-描述符

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

a类中的属性a.fa,是通过b类来访问、设置、删除的,那么b类就叫属性a.fa的描述符
(用b类描述fa到底是什么样子的)

有时候,某个应用程序可能会有一个相当微妙的需求,需要你设计一些更为复杂的操作来响应(例如每当属性被访问时,你也许想创建一个日志记录)。最好的解决方案就是编写一个用于执行这些“更复杂的操作”的特殊函数,然后指定它在属性被访问时运行。那么一个具有这种函数的对象被称之为描述符.

简言之:描述符就是一个类,一个至少实现 get()、set() 或 delete() 三个特殊方法中的任意一个的类

作用:可以让程序更加优雅,这里有一些说明

__get__(self,instance,owner)    # 用于属性访问,返回属性的值

__set__(self,instance,value)    # 将属性分配操作中调用,无返回值

__delete__(self,instance,value)    # 控制删除操作不返回

举个栗子:

1.定义一个温度类

2.定义两个描述类(描述摄氏度和华氏度两个属性)

3.要求摄氏度与华氏度可以相互转换(即:通过给摄氏度属性赋值,可打印出华氏度属性)

说明:例子中类Temperature的属性cel、属性fah,一两句话描述不清楚,所以借助专门的类来描述

他们,这个类就叫描述符

class Celsius:  # 描述类:摄氏度
    def __init__(self, value=26.0):     #初始化
        self.value = float(value)

    def __get__(self, instance, owner):     # 当类Celsius被获得时调用(cel = Celsius())
        return self.value                   # instance:实例(这里是t);ower:拥有者(这里是Temperature)

    def __set__(self, instance, value):     # 当类Celsius被设置时调用(cel = Celsius(30))
        self.value = float(value)           # instance:实例(这里是t);value:具体值


class Fahrenheit:  # 描述类:华氏度
    def __get__(self, instance, owner):     # 当类Celsius被获得时调用(fah = Fahrenheit())
        return instance.cel * 1.8 + 32      # instance:实例(这里是t);ower:拥有者(这里是Temperature)

    def __set__(self, instance, value):     # 当类Celsius被设置时调用(fah = Fahrenheit(100))
        instance.cel = (float(value) - 32) / 1.8    # instance:实例(这里是t);value:具体值


class Temperature:  # 温度类:拥有Celsius和Fahrenheit两个描述符
    cel = Celsius()
    fah = Fahrenheit()

运行:

t = Temperature()
print(t.cel)

结果:

26.0

运行:

t = Temperature()
t.cel = 30
print(t.fah)

结果:

86.0

运行:

t = Temperature()
t.fah = 100		# fah赋值:自动执行Fahrenheit:__set__;instance.cel = (float(value) - 32) / 1.8
                # 这里的instance.cel等价于t.cel,是对cel赋值:自动执行Celsius:__set__:self.value = float(value)
                # 对t.cel赋予了新的值37.7777
print(t.cel)	# 访问t.cel:自动执行Celsius:__get__return self.value

结果:

37.77777777777778

猜你喜欢

转载自blog.csdn.net/weixin_40960364/article/details/105930383
今日推荐