python - 为什么属性不更新?
问题描述
为什么电子邮件属性没有更新,但第一个属性“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())
解决方案
类的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)
推荐阅读
- c# - 通过缩放到父级缩放以适合画布,但通过滚动查看器提供缩放
- c++ - 从哪里开始创建 D3D11 Hook 以制作游戏覆盖?
- r - 如何使用 R 中的循环对多个条件的矩阵进行子集化?
- python - 循环中的多个图 - 底图python
- javascript - 反应原生地图可拖动标记onDragEnd位置?
- gateway - Thingsboard Gateway SigFox - 消息未到达
- excel - VBA Excel值显示为整数,而为文本
- python - conda 破坏了 dnf、yum、yum 已弃用;我都试过了:重新安装了 dnf、python 等 Fedora 29
- java - 如何为 Steam 准备安装 Java 应用程序?
- java - android:将大字符串转换为字节并通过网络发送是否安全?