2017-08-17 19 views
0

私は、Pythonに非常に新しいですし、現在は今サブクラス化namedtuple、__new__と__init__

の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:

を持っています!


警告の2番目は __init__ブロックから来ています。

super(Aloe, self).__init__()は「パラメータ 『型名のために非難されたので、私は希望「型名」としてそれに良い'Plant'を与えた

を未充填」。それから私は得た、

TypeError: object.__init__() takes no parameters

(ノಠ益ಠ)ノ彡┻━┻戻るポイントへ


  1. 私のコードが動作しているが、私PyCharmから多数の警告を受け取ります。

  2. PyCharmを満たすことができる方法はまったくありません。

だから、私は物事を処理するPython的方法を無視するかもしれないと心配です。私がいれば、私はいくつかのヒントを使うことができたらいいと思う。

+0

データベースの行は常にが行辞書に正確に右の3つのキーが生成されます場合は、だけでも、直接namedtupleと上記**params構文を使用し、ファクトリメソッドを気にしないでください私はなぜあなたが '__init__'メソッドを持っているのか疑問に思っていますが、そうでなければコードはうまく見えます。 PyCharmにコードが正常であると伝える方法についてのドキュメントを見つけて、次に進む。 –

+0

pycharmはあなたのコードが私には妥当ではないと言っています。なぜなら、 'Aloe = namedtuple( 'Aloe'、['name'、 'color'、 'loveliness'])の代わりに、 'アロエ=アロエ(**パラーム)'。 – Goyo

+0

@ Goyo私は、データベースとの通信のためにサブクラスの下にさらにカスタマイズされたメソッドを配置したいので、namedtupleを拡張しようとしています。この場合、私が正しい方向に考えていると思いますか? –

答えて

2

ここでPyCharmは過度に保護されており、起動するのが間違っています。これは、キーと値のペアを適用

Aloe.from_row(**params) 

:1を作成するときに

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を使用する:あなたがやってみたかったすべては、いくつかのデフォルト値を提供している場合は、私は、ファクトリメソッドを使用したいです別のキーワード引数としてparamsから欠落しているキーはNoneに設定され、余分なキーは**ignoredに取り込まれ無視されます。

Aloe(**params) 
関連する問題