您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

即使我清楚地为其分配了一个不同的值,方法属性也不会自动更新

即使我清楚地为其分配了一个不同的值,方法属性也不会自动更新

如果我们person在用行实例化对象后立即打开它person = Email("James"),则将是这样的:

person {
"name"  : "James", 
"email" : "James@hotmail.com"
}

如果像您一样使用来更新nameperson对象中的变量person.name = "Michael",然后person再次打开该对象,则可能是:

person {
"name"  : "Michael", 
"email" : "James@hotmail.com"
}

请注意,在此阶段,它仍然是person我们之前实例化的对象,并且该email变量未从其先前状态更改,因为我们尚未对其进行任何处理。

通过将emailfield设置为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是Python内置函数property对象具有以下方法

现在,@chepner的答案中到底发生了什么?在下面的行中,我们将设置emailproperty

    @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

然后,对于setterdeleter,我们可以将它们创建为:

    @email.setter
    def email(self, input_email):
        self._email = input_email

    @email.deleter
    def email(self):
        del self._email

请注意,gettersetter,和deleter方法都具有相同的名称property,只是不同的装饰。

从问题描述中,不需要支持单独更新电子邮件地址,但是仅在此示例之后,如果我们运行person.email = "Michael@hotmail.com",因为它是emaila property,它将触发将setter设置为_email变量的值。

回到@chepner的答案中的details方法

    def details(self):
        return f'{self.name} | {self.email}'

通过执行此操作,self.email我们触发,getter以返回该return语句中动态生成的电子邮件地址return f'{self.name}@hotmail.com'

其他 2022/1/1 18:40:32 有545人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶