我有一個類,其中包含一些屬性/屬性,這些屬性/屬性將通過讀取以 str 作為鍵和項的字典在 init 中設定。這些值將被轉換為類屬性/屬性。所以我有這樣的事情:
class Attendee:
def __init__(self, attendee):
# creating a small example attendee dict here:
self.attendee = {"email": "[email protected]", "id": "1234"}
self._email = None
self._id = None
self.init_attribute = {"email": self.email, "id": self.id}
self.init_attributes()
def init_attributes(self):
for k in self.attendee.keys():
self.init_attribute[k] = self.attendee[k]
@property
def email(self):
return self._email
@email.setter
def email(self, value):
self._email = value
@property
def id(self):
return self._id
@id.setter
def id(self, value):
self._id = value
這個想法是使用 dict self.init_attribute 將為我節省很多代碼行。但是,這不起作用。初始化后所有屬性仍然為None。因此,self.init_attribute[k] = self.attendee[k]像這樣呼叫時無法設定屬性。誰能向我解釋為什么這不起作用,以及可能的解決方案?
uj5u.com熱心網友回復:
該函式init_attributes沒有設定類的屬性。一種方法是使用setattr:
def init_attributes(self):
for k, v in self.attendee.items():
setattr(self, k, v)
那么它可以按如下方式完成:
att = Attendee(None)
print(att.email)
輸出
[email protected]
uj5u.com熱心網友回復:
你不需要 setter 函式。請嘗試以下解決方案
class Attendee:
def __init__(self, attendee):
# creating a small example attendee dict here:
self.attendee = attendee
self._email = self.attendee['email']
self._id = self.attendee['id']
@property
def email(self):
return self._email
@email.setter
def email(self, value):
self._email = value
@property
def id(self):
return self._id
@id.setter
def id(self, value):
self._id = value
a = Attendee({"email": "[email protected]", "id": "1234"})
print(a.email)
print(a.id)
uj5u.com熱心網友回復:
所以這里的基本問題是你從來沒有真正將屬性的值設定為任何東西;在 中init_attributes,您只是將給定鍵的值設定為該鍵在不同字典中的值,但這實際上從未分配給屬性。
為了實作您想要做的事情,您可以使用以下operator模塊來解構您的 dict 并將其直接分配給相關屬性:
from operator import itemgetter
class Attendee:
def __init__(self, attendee):
# creating a small example attendee dict here:
self.attendee = {"email": "[email protected]", "id": "1234"}
self._email, self._id = itemgetter('email', 'id')(self.attendee)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/345367.html
