如下所示,更新类属性不会更改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”。
答案 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())