【问题标题】:call setter from __init__ in Python在 Python 中从 __init__ 调用 setter
【发布时间】:2021-05-19 17:35:21
【问题描述】:

我有一个这样的课程:

class Ticket:
    def __init__(self, ticket):
        self._subject = ticket.subject
        self._oem = self.oem()
    
    @property
    def oem(self):
        return self._oem

    @oem.setter
    def oem(self):
        #set oem value by extracting it from subject using regex
        self._oem = re.findall('<OEM: (.*?)>', self._subject)[0].strip()

但是,在创建对象时,

obj = Ticket(test_ticket)

我收到一个错误,

AttributeError: 'Ticket' object has no attribute '_oem'

我看过类似的问题,但他们问的问题和我不一样。 我想在 __init__ 方法中设置 oem 的值,方法是使用前一个变量的值,而不是从外部传递值。

我该如何解决这个问题?

【问题讨论】:

  • 您希望self._oem = self.oem() 做什么?另请注意,您的 setter 缺少参数。

标签: python-3.x class properties setter


【解决方案1】:

属性设置器需要接受一个值,它会在分配给属性时被调用,例如

t = Ticket()
t.oem = value  # this would call call Ticket.oem(t, value)

如果该属性只使用来自self._subject 的数据,则根本不要编写setter。相反,使属性成为动态计算的只读属性,如下所示:

class Ticket:
    def __init__(self, ticket):
        self._subject = ticket.subject
    
    @property
    def oem(self):
        return re.findall('<OEM: (.*?)>', self._subject)[0].strip()

【讨论】:

  • 好的,明白了。但是,每次我需要访问它时,都会进行一些处理,这是正确的吗?假设我知道我将使用这个值 5 次,并且我将有 6 个这样的值,这些值将被动态计算。然后,每次访问这些值时,它们都会经过我定义的一些逻辑。我想这会降低效率(但可能不明显)
  • 是的,每次你访问 Python 时,它都会做大约 5000 件其他事情。对于一个简单的正则表达式,发现它一分钱都没有关系,所以不用担心。
  • @cached_property - @wim 我认为这也是一件好事。对于每个对象,OEM(或其他属性)将在对象的整个生命周期中保持不变。参考:docs.python.org/3/library/…
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 2018-11-23
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多