首页 > 解决方案 > 为什么属性不更新?

问题描述

为什么电子邮件属性没有更新,但第一个属性“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())

标签: pythonattributes

解决方案


类的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)

推荐阅读