2017-12-03 119 views
1

我正在嘗試構建一個元類,我只是在想我真的懂了它。我想爲這個元類的每個實例都有類方法。調用對方的元類方法的最佳做法是什麼?

class MyMeta(type): 
    """A metaclass""" 
    def __new__(mcs, name, bases, attributes): 
     pass 

    def _foo(cls): 
     pass 

    def _bar(cls): 
     cls._foo() 

當我在它上面運行pylint的,該cls._foo有困難:

[pylint] E1120:No value for argument 'cls' in unbound method call 

當我嘗試運行的代碼(我的代碼是比這更復雜),這似乎是運行良好,並做我期待它做什麼。那麼我該如何解決這個問題呢?這究竟意味着什麼。

這聽起來像其他錯誤有關沒有正確地聲明爲@staticmethods東西,但我不能標記爲@classmethod因爲那麼它將是一個Metaclass方法。

相關搜索似乎是在討論人們動態添加構造函數的地方,我不認爲這是這種情況。我是否仍然對元類有所誤解?

我真正想要的是在元類中定義的相互調用的類方法。有一個更好的方法嗎?

+0

https://stackoverflow.com/questions/35208443/pylint-complains-no-value-for-argument-cls – SteveJ

+0

@SteveJ這就是我特別提到的情況。該問題中的OP期望構造函數在派生類中聲明。這裏不是這種情況。 – McKay

回答

1

[pylint的] E1120:在未綁定的方法調用的參數沒有價值 'CLS'

至於你metaclasss而言,你的_foo_bar方法都只是普通的Python方法 - 這意味着Python的將在調用這些方法時自動填充對每個類(元類實例)的引用。

而且,因爲這是一個元類,爲了清晰,語義和可讀性,最好按照以下方式進行:將第一個參數命名爲cls而不是self

問題在於,pylint並沒有提到這個問題:它很可能是一個硬編碼的self。 你的代碼在這方面是無法理解的。

所有你需要做的就是添加一個元註釋foylint忽略這些行 - 幸運的是,Pylint允許它在塊級,不像一些工具,你必須在每一行標記。

class MyMeta(type): 
    """A metaclass""" 
    # pylint: disable=no-value-for-parameter 

    def __new__(mcs, name, bases, attributes): 
     pass 

    def _foo(cls): 
     pass 

    def _bar(cls): 
     cls._foo() 

您的示例元類,帶有「元註釋」,以便pylint忽略您的非錯誤。

+0

+1,這很有道理。但我認爲你的答案相當於「我認爲這是pylint中的一個bug /限制,只是禁用它。」不是說我認爲你錯了,但這裏沒有什麼是權威的。 – McKay

+0

我已經編輯了一個更清晰一點的問題標題。 – McKay

+0

這不會改變我的答案。有一部分內容在閱讀「......這樣做好得多」。 您只需注意,元類中的這些方法在類的實例中將不可見:它們只是類方法。 (這有時是一個優點,而且是一個設計,我希望Python的日期時間。datetime'已採取) – jsbueno

相關問題