为什么属性不更新?

Why Is Attribute Not Updating?

为什么电子邮件属性没有更新,但第一个属性“self.first”更新了?我知道 init 方法仅在您创建对象时调用,并且它使用传递给对象的值。但是我更新了对象中的值并更新了 init 方法中的第一个属性并且第一个属性被正确打印,为什么不是第三个属性,'self.email' 包括'self.first'?

我知道您可以创建另一种方法来正确打印电子邮件,但我想知道为什么这种特定方法不起作用。

    def __init__(self, first, last):
        self.first = first
        self.last = last
        self.email = first + '.' + last + '@email.com'

    def fullname(self):
        return '{} {}'.format(self.first, self.last)



emp_1 = Employee('John', 'Smith')

emp_1.first = 'Jim'

print(emp_1.first)
print(emp_1.email)
print(emp_1.fullname())

class 的 init 方法仅在 class 的实例实例化期间执行一次。如果您在 init 期间设置实例变量,那么除非明确修改,否则它们不会更改。

这里有一个更合适的 OO 方法来解决这个问题:-

class Employee:
    def __init__(self, first, last):
        self._first = first
        self._last = last
    @property
    def email(self):
        return f'{self.first}.{self.last}@email.com'
    @property
    def first(self):
        return self._first
    @property
    def last(self):
        return self._last
    @first.setter
    def first(self, first):
        self._first = first
    @last.setter
    def last(self, last):
        self._last = last

E = Employee('John', 'Smith')
print(E.email)
E.first = 'Jim'
print(E.email)
E.last = 'Jones'
print(E.email)

当您在构造函数中设置 email 值时,表达式 self.email = first + '.' + last + '@email.com' 会在构造新对象期间立即计算一次。这意味着 Python 从 firstlast 参数的值构建一个字符串,并将其保存为 Employee 对象中的一个字段。由于它只构建一次,所以即使您更改名字或姓氏,它的值也不会改变。

您似乎已经预料到它会保存如何构建电子邮件字符串的逻辑,并在每次您想要访问员工的电子邮件地址时重新评估它。您可以通过添加方法或 属性 来自己完成此操作,每次调用时都会对其进行评估:

@property
def email(self):
    return f'{self.first}.{self.last}@email.com'

这样,电子邮件地址将反映对 firstlast 的所有更新。第一种技术称为 eager evaluation,而第二种方法称为 lazy evaluation,如果您想阅读更多有关其背后概念的信息。