我有一个这样的类:
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的值,通过使用前一个变量的值,而不是通过从外部传递值。
如何解决这个问题?
属性设置器需要接受一个值,它将在赋值给属性时被调用,例如
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()