为什么此类中的函数不使用更新的类属性?

时间:2019-06-19 09:13:01

标签: python class attributes

如下所示,更新类属性不会更改init函数中使用的属性的值,但会更改用于以下类函数的值。为什么会这样?

我刚刚开始尝试上课,所以我不确定可以尝试什么替代方法。

class Employee:

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

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

emp_1 = Employee('Micheal', 'scoot', 50000)
emp_1.last = 'Scott'        

print(emp_1.email)       # - > Micheal.scoot@company.com  
print(emp_1.fullname())  # - > Micheal Scott 

上面的注释显示了我收到的输出。我希望电子邮件功能使用更新的姓氏“ Scott”代替“ scoot”。

2 个答案:

答案 0 :(得分:3)

如果您想要这种行为,则需要将email变成property(并且您可能应该对fullname做同样的事情)

class Employee:
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay

    @property
    def email(self):
        return self.first + "." + self.last + "@company.com"
        # return f"{self.first}.{self.last}@company.com"

    @property
    def fullname(self):
        return "{} {}".format(self.first, self.last)
        # return f"{self.first} {self.last}"

这将按预期工作:

emp_1 = Employee('Micheal', 'scoot', 50000)
emp_1.last = 'Scott'        
print(emp_1.email)       # -> Micheal.Scott@company.com 
print(emp_1.fullname)    # now without parentheses! -> Micheal Scott

在原始代码中,您在构造函数中分配了self.email。这样,如果您之后更改self.last,它将不会得到更新。

答案 1 :(得分:0)

仅在创建emp_1的过程中在init函数中计算self.email。更改emp_1.last时,它不会重新触发计算电子邮件的行。您可以通过为电子邮件添加功能来获得所需的行为:

def email(self):
    return self.first + '.' + self.last + '@company.com'

...

print(emp_1.email())