gpt4 book ai didi

python - 覆盖使用@property设置的属性

转载 作者:行者123 更新时间:2023-12-01 00:35:40 26 4
gpt4 key购买 nike

我想知道在这种情况下如何更新使用 @property 装饰器设置的属性。 (下面的代码将告诉您更多信息...)

当我尝试在没有 setter 的情况下更新电子邮件时,收到 AttributeError: can't set attribute。当我使用 setter 时,没有任何变化。新电子邮件既不使用名字也不使用姓氏。

有人可以帮忙吗?

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".lower()

# @email.setter
# def email(self, new_email):
# return new_email

最佳答案

我认为这里最直接的路径是取消该属性,而是将 email 设为默认为 first.last 的可选参数:

class Employee:
def __init__(self, first, last, email=None):
self.first = first
self.last = last
self.email = email if email else f"{first}.{last}@email.com".lower()

现在您可以使用通常的点符号修改现有实例的电子邮件地址:

>>> e = Employee('John', 'Doe')
>>> e.email
'john.doe@email.com'
>>>
>>> e.email = 'a@b.com'
>>> e.email
'a@b.com'

如果您确实想保留该属性,则 setter 需要更新实例属性:

class Employee:
def __init__(self, first, last):
self.first = first
self.last = last
self._email = f"{first}.{last}@email.com".lower()

@property
def email(self):
return self._email

@email.setter
def email(self, addr):
self._email = addr

如果您需要在接收过程中进行一些验证,您可以选择此模式 - 例如,确认新电子邮件具有 @ 符号:

    @email.setter
def email(self, addr):
if '@' not in addr:
raise ValueError('nope!')
self._email = addr

但除此之外,第一种选择要简单一些。

关于python - 覆盖使用@property设置的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57805669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com