返回介绍

19.5 处理属性删除操作

发布于 2024-02-05 21:59:47 字数 1755 浏览 0 评论 0 收藏 0

学过 Python 教程,我们知道,对象的属性可以使用 del 语句删除:

del my_object.an_attribute

其实,使用 Python 编程时不常删除属性,通过特性删除属性更少见。但是,Python 支持这么做,我可以虚构一个示例,演示这种处理方式。

定义特性时,可以使用 @my_propety.deleter 装饰器包装一个方法,负责删除特性管理的属性。下面兑现承诺,虚构一个示例,说明如何定义特性删值方法,如示例 19-26 所示。

示例 19-26 blackknight.py:灵感来自电影《巨蟒与圣杯》中的黑衣骑士角色

class BlackKnight:

  def __init__(self):
    self.members = ['an arm', 'another arm',
            'a leg', 'another leg']
    self.phrases = ["'Tis but a scratch.",
            "It's just a flesh wound.",
            "I'm invincible!",
            "All right, we'll call it a draw."]

  @property
  def member(self):
    print('next member is:')
    return self.members[0]

  @member.deleter
  def member(self):
    text = 'BLACK KNIGHT (loses {})\n-- {}'
    print(text.format(self.members.pop(0), self.phrases.pop(0)))

blackknight.py 脚本的 doctest 在示例 19-27 中。

示例 19-27 blackknight.py:示例 19-26 的 doctest(黑衣骑士从不屈服)

>>> knight = BlackKnight()
>>> knight.member
next member is:
'an arm'
>>> del knight.member
BLACK KNIGHT (loses an arm)
-- 'Tis but a scratch.
>>> del knight.member
BLACK KNIGHT (loses another arm)
-- It's just a flesh wound.
>>> del knight.member
BLACK KNIGHT (loses a leg)
-- I'm invincible!
>>> del knight.member
BLACK KNIGHT (loses another leg)
-- All right, we'll call it a draw.

在不使用装饰器的经典调用句法中,fdel 参数用于设置删值函数。例如,在 BlackKnight 类的定义体中可以像下面这样创建 member 特性:

member = property(member_getter, fdel=member_deleter)

如果不使用特性,还可以实现低层特殊的 __delattr__ 方法处理删除属性的操作,参见 19.6.3 节。留给喜欢拖延的读者一个练习:虚构一个类,定义 __delattr__ 方法。

特性是个强大的功能,不过有时更适合使用简单的或底层的替代方案。在本章的最后一节中,我们将回顾 Python 为动态属性编程提供的部分核心 API。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文