OP中出了什么问题?
如果我们
person在用行实例化对象后立即打开它
person = Email("James"),则将是这样的:person {"name" : "James", "email" : "James@hotmail.com"}如果像您一样使用来更新
name该
person对象中的变量
person.name ="Michael",然后
person再次打开该对象,则可能是:
person {"name" : "Michael", "email" : "James@hotmail.com"}请注意,在此阶段,它仍然是
person我们之前实例化的对象,并且该
通过将
property,并使用
name变量动态设置,@
chepner发布的答案非常好且干净。以下是@chepner的代码的副本:
class Email: def __init__(self, name): self.name = name # self.email = self.name + "@hotmail.com" @property def email(self): return f'{self.name}@hotmail.com' def details(self): return f'{self.name} | {self.email}'什么是property
它,如何使用?
property是Python内置函数,
property对象具有以下方法:
getter
:用于获取属性值setter
:用于设置属性值deleter
:用于删除属性值
现在,@
chepner的答案中到底发生了什么?在下面的行中,我们将设置
property:
@property def email(self): return f'{self.name}@hotmail.com'并且此装饰功能也可以用作
getter例如
person.email。
请注意,在这里我们没有将其链接到变量(如Python文档示例所示),如果需要/需要,我们可以通过替换
return语句并在中设置
_email变量来实现
__init__:
def __init__(self, input_name): self._name = input_name self._email = f'{self._name}@hotmail.com' @property def email(self): return self._email然后,对于
setter和
deleter,我们可以将它们创建为:
@email.setter def email(self, input_email): self._email = input_email @email.deleter def email(self): del self._email
请注意,
getter,
setter,和
deleter方法都具有相同的名称
property,只是不同的装饰。
从问题描述中,不需要支持单独更新电子邮件地址,但是仅在此示例之后,如果我们运行
person.email ="Michael@hotmail.com",因为它是
property,它将触发将
setter设置为
_email变量的值。
回到@chepner的答案中的
details方法:
def details(self): return f'{self.name} | {self.email}'通过执行此操作,
self.email我们触发,
getter以返回该
return语句中动态生成的电子邮件地址
returnf'{self.name}@hotmail.com'。


