Python学习:描述符(property的原理)

一、定义

(1)描述符将某种特殊类型的类的实例指派给另一个类的属性
(2)特殊类:至少在类里定义__get__()__set__()或者__delete__三个特殊方法中的任意一个
(3)相关魔法方法

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

(4)property 的使用

二、示例

  1. 示例 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是这个描述符的拥有者所在的类本身。

  1. 示例 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)

`

  1. 示例 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)

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值