Python: 描述器 __get__(),__set__() 和 __delete__()Python: 描述器 __get__(),__set__() 和 __delete__()Python: 描述器 __get__(),__set__() 和 __delete__()Python: 描述器 __get__(),__set__() 和 __delete__()
  • 首页
  • 博客
  • 书签
  • 文件
  • 分析
  • 登录

Python: 描述器 __get__(),__set__() 和 __delete__()

发表 admin at 2022年9月7日
类别
  • Python
标签

官方文档

描述器的应用案例:Python内置的 property()

# 描述器练习
class RevealAccess(object):
    def __init__(self, val):
        self.val = val

    def __get__(self, obj, objtype=None):
        print('Retrieving', self.val)
        return self.val

    def __set__(self, obj, val):
        print('Updating', val)
        self.val = val


class Test(object):
    def __init__(self, val, get=False):
        self.val = val
        if get:
            self.get()

    def get(self):
        return self.val


class MyClass(object):
    r = RevealAccess(10)  
    # RevealAccess是描述器,描述MyClass的属性r
    # 访问MyClass的属性r时,触发RevealAccess中__get__方法,获取并返回RevealAccess中的属性的值给r
    # 若对r赋值,则会触发RevealAccess中__set__方法,对RevealAccess中的属性赋值
    t = Test(20)  # Test是一个普通的类,属性t是一个Test的实例
    tg = Test(20, True)  # 无法从__init__返回值,所以tg仍然是一个Test的实例,而不是Test中的属性val


r = RevealAccess(10)
print(r.val)  # 10

m = MyClass()
print(a := m.r, type(a))  # Retrieving 10  \n 10 <class 'int'>
m.r = 30  # Updating 30
print(m.r)  # Retrieving 30  \n 30

print(b := m.t, type(b))  # <__main__.Test object at 0x7f4094dbfd00> <class '__main__.Test'>
print(b.val)  # 20
print(c := m.tg, type(c))  # <__main__.Test object at 0x7f4094dbfca0> <class '__main__.Test'>
print(c.val)  # 20

发表回复 取消回复

要发表评论,您必须先登录。

类别

  • Cat
  • Python
  • Django
  • Database
  • Html/CSS
  • JavaScript
  • Vue
  • RegExp
  • Maths/AI
  • PHP/Wordpress
  • Practice
  • Linux
  • Windows
  • Android
  • NAS
  • Software
  • Hardware
  • Network
  • SEO
  • English
  • Games
  • Recipes
  • General
  • Memorandum
  • Essays
  • 未分类

归档

©2015-2023 艾丽卡 Blog support@alaica.com
      ajax-loader