2 回答
TA贡献1848条经验 获得超6个赞
我最近了解了@property 装饰器,但(至少)有一件事我还不了解。在下面的这个类中,my_name 显然是属性名称,但根本不清楚该值是如何实际分配的。唯一的赋值是给带下划线的 _my_name 变量,但是装饰器怎么知道 self._my_name 对应于 my_name 属性呢?
class Person:
def __init__(self, input_name):
self._my_name = input_name
@property
def my_name(self):
return self._my_name
@my_name.setter
def my_name(self, value):
self._my_name = value
TA贡献1836条经验 获得超3个赞
Aproperty是一个描述符。它知道从哪里获取和设置_my_name,因为这是您的 getter 和 setter 方法告诉它获取和设置的内容。下面是一个描述符如何在内部工作的简单示例:
class MyProperty:
def __init__(self, name):
# The name of the property we are wrapping
self.name = name
def __get__(self, instance, owner):
# Property was requested from the class, not an instance
if instance is None:
return self
return getattr(instance, self.name)
def __set__(self, instance, value):
# Don't overwrite ourself...
if instance is None:
return
setattr(instance, self.name, value)
class Person:
def __init__(self, input_name):
self._my_name = input_name
# Define my_name, that will get/set _my_name
my_name = MyProperty('_my_name')
jack = Person('Jack')
print(jack.my_name)
jack.my_name = 'Jane'
print(jack.my_name)
该属性以类似的方式工作,它记住其定义的 getter、setter 和 deleter 回调,并在检索/分配描述符时调用它们。
添加回答
举报