【问题标题】:How to get setters and getters in python如何在python中获取setter和getter
【发布时间】:2020-02-09 12:54:21
【问题描述】:

使用以下内容:

class MyClass:
    def __init__(self):
        self.title = None
    @title.setter
    def title(self, title):
        print ('TITLE SETTER: %s' % title)
        self._title = title

NameError: 名称“标题”未定义

上面的代码有什么问题?

【问题讨论】:

  • 我 ... err ... 你有没有尝试过各种解释器?
  • 这两个都无效。
  • 你要使用@property吗?
  • 可能您应该首先使用@property def title(self): return 'Hello World' 创建getter。然后你可以使用@title
  • @furas 这似乎是问题所在。

标签: python


【解决方案1】:

名称title 在您首次创建之前不会存在于类的主体中。 事实是,允许 getter 和 setter 在 Python 中以这种方式存在的是描述符协议 - 有一个名为 property{ . Back in the old times (circa Python 2.4), it was found out that if property taking a single argument would return apropertyobject with a.setter 的辅助可调用属性,该属性可以用作注册 setter 的装饰器同一对象的方法。

在此之前,必须将 getter、setter 和 deleter 声明为普通方法,并使用如下行创建属性对象 title = property(title_getter, title_setter, tittle_deleter) 在类体内。

因此,如果你这样做:

class MyClass:
    def __init__(self):
        self.title = None

    @property
    def title(self):
        return self._title

    @title.setter
    def title(self, title):
        print 'TITLE SETTER: %s' % title
        self._title = title

您的代码将起作用,因为 property 是用 函数 title 作为参数 - 然后它返回一个 property 对象, 其中有一个__get__ 方法会导致原始 要调用的title 函数,以及setterdeleter 属性, 这是可调用的 - title.setter 用作装饰器时, 只需在内部将其添加到属性对象,以便其 __set__ 方法 将导致它被调用。 (property 内部使用的描述符协议和__set____delete____get__ 方法的工作在语言Data Model 文档中进行了描述)

【讨论】:

  • @property@title.getter 一样吗?
  • 没有。该语言不会“猜测”您将尝试创建一个名为“title”的属性 - 它正在声明该函数,并用“property”装饰它,这使得名为“title”的对象“property”存在于那个点。
猜你喜欢
  • 2016-02-24
  • 2018-05-11
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 2020-05-29
  • 2023-03-04
  • 2019-06-10
  • 1970-01-01
相关资源
最近更新 更多