为什么属性不更新?
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 从 first
和 last
参数的值构建一个字符串,并将其保存为 Employee 对象中的一个字段。由于它只构建一次,所以即使您更改名字或姓氏,它的值也不会改变。
您似乎已经预料到它会保存如何构建电子邮件字符串的逻辑,并在每次您想要访问员工的电子邮件地址时重新评估它。您可以通过添加方法或 属性 来自己完成此操作,每次调用时都会对其进行评估:
@property
def email(self):
return f'{self.first}.{self.last}@email.com'
这样,电子邮件地址将反映对 first
和 last
的所有更新。第一种技术称为 eager evaluation,而第二种方法称为 lazy evaluation,如果您想阅读更多有关其背后概念的信息。
为什么电子邮件属性没有更新,但第一个属性“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 从 first
和 last
参数的值构建一个字符串,并将其保存为 Employee 对象中的一个字段。由于它只构建一次,所以即使您更改名字或姓氏,它的值也不会改变。
您似乎已经预料到它会保存如何构建电子邮件字符串的逻辑,并在每次您想要访问员工的电子邮件地址时重新评估它。您可以通过添加方法或 属性 来自己完成此操作,每次调用时都会对其进行评估:
@property
def email(self):
return f'{self.first}.{self.last}@email.com'
这样,电子邮件地址将反映对 first
和 last
的所有更新。第一种技术称为 eager evaluation,而第二种方法称为 lazy evaluation,如果您想阅读更多有关其背后概念的信息。