[英]Subclassing namedtuple, __new__ and __init__
我是Python的新手,目前正在使用Python 3.4
現在,我顯然正在全力以赴,想出如何通過子類化'namedtuple'來最好地創建定制的不可變對象。
這是我的代碼,可以正常運行,但是我的好朋友PyCharm收到了太多警告消息,因此我被迫確定是否正確執行此操作。
from collections import namedtuple
class Aloe(namedtuple('Plant', [
'name',
'color',
'loveliness'
])):
def __new__(cls, params):
return super(Aloe, cls).__new__(
cls,
params.get('name'),
params.get('color'),
params.get('loveliness')
)
def __init__(self, params):
print(self.name)
super(Aloe, self).__init__()
當我打電話給我時,我明白了。
>>> aloe = Aloe(params)
>>> print(aloe)
Aloe(name='aloey', color='green', loveliness='extreme')
__new__
塊。
我的所有params.get('FIELD_NAME')
被指責為“ 意外參數 ”。
有趣的是,如果我刪除參數,我會得到,
TypeError: __new__() missing 1 required positional argument:
這東西真的要我做什么?!
__init__
塊。
super(Aloe, self).__init__()
被指責為' 參數'typename'未填充 '
因此,我給它一個好的'Plant'
作為所需的“類型名稱”。 然后我得到了
TypeError: object.__init__() takes no parameters
(ノಠ益ಠ)ノ彡┻━┻
回到重點,
我的代碼正在運行,但是我收到了來自PyCharm的大量警告。
似乎絕對無法滿足PyCharm。
因此,我擔心自己可能會忽略Python處理事物的方式。 如果我願意,我希望可以使用一些技巧。
PyCharm在此過於保護,無法正確啟動。 但是,如果您只想提供一些默認值,則可以使用工廠方法:
class Aloe(namedtuple('Plant', 'name color loveliness')):
@classmethod
def from_row(cls, name=None, color=None, loveliness=None, **ignored):
return cls(name, color, loveliness)
並在創建一個時使用**params
:
Aloe.from_row(**params)
這會將來自params
的鍵/值對用作單獨的關鍵字參數。 缺少的鍵將設置為None
,多余的鍵將以**ignored
和忽略的方式捕獲。
如果您的數據庫行將始終在行字典中生成恰好正確的3個鍵,那么甚至不用理會工廠方法,只需直接使用namedtuple
和上面的**params
語法即可:
Aloe(**params)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.