要使用以下内容:
class MyClass:
def __init__(self):
self.title = None
@title.setter
def title(self, title):
print ('TITLE SETTER: %s' % title)
self._title = title
NameError:名称“ title”未定义
上面的代码有什么问题?
答案 0 :(得分:3)
在您第一次创建该名称之前,该名称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 a
property object with a
。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
函数以及setter
和deleter
属性,
是可调用的-title.setter
用作修饰符时,
只需在内部将其添加到属性对象中,以便其__set__
方法
将导致它被调用。 (__set__
内部使用的描述符协议以及__delete__
,__get__
和property
方法的工作在Data Model语言中进行了说明)>