欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python入门——Property

程序员文章站 2022-05-08 09:26:05
...

文章目录


Python入门——Property
以下内容来自于网课学习笔记。

使用的环境:

  • Window10+64位操作系统
  • PyCharm+Python3.7

一、描述符

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

特殊类型的类 必须实现以下3个函数:

  • get(self, instance, owner)
    用于访问属性,它返回属性的值。
    ◼◼ instance: 拥有者类的实例
    ◼◼ owner:拥有者类本身
  • set(self, instance, value)
    将在属性分配操作中调用,不返回任何内容
  • delete(self, instance)
    控制删除操作,不返回任何内容
class My:
    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=My()

test=Test()
# 调用get
test.x       #——————>getting··· <__main__.My object at 0x0000025D1A54DB48> <__main__.Test object at 0x0000025D1A55F1C8> <class '__main__.Test'>

# 调用set
test.x="hh"  #——————>setting··· <__main__.My object at 0x0000025D1A54DB48> <__main__.Test object at 0x0000025D1A55F1C8> hh

# 调用delete
del test.x   #——————>deleting··· <__main__.My object at 0x000001B3CF65DB08> <__main__.Test object at 0x000001B3CF66F188>

实现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, 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

    x = MyProperty(getX, setX, delX)


c = C()
c.x = "ff"
print(c.x)
print(c._x)

del c.x
# 属性_x被删除
print(c._x)