簡體   English   中英

子類化namedtuple,__ new__和__init__

[英]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

(ノಠ益ಠ)ノ彡┻━┻


回到重點,

  1. 我的代碼正在運行,但是我收到了來自PyCharm的大量警告。

  2. 似乎絕對無法滿足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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM