0

私はPythonで小さなプロジェクトに取り組んでいます。便宜上、複数の初期化子が必要なクラスをセットアップしました。Python は、位置引数が不足していると言い続けますが、適切な数値を明示的に渡さない場所ではイニシャライザを呼び出しません。小規模なテスト ケースで問題を再現しようとしましたが、同じことを行うことはできません。これはちょっとしたコードなので、https ://gist.github.com/anonymous/6568115 でホストされています。

それが与えるエラーは次のとおりです。

  File "./cards.py", line 40, in types
    if is_subset(types, self.__class__().VALID_TYPES):
TypeError: __init__() missing 5 required positional arguments: 'name', 'types', 'colors', 'land_type', and 'required_types'
4

3 に答える 3

5

self.__class__()イニシャライザを呼び出しています。使用するだけ、self.__class__.VALID_TYPESまたは単にself.VALID_TYPES

于 2013-09-15T05:00:18.330 に答える
3

主なエラーは 2 つあります。

  1. __class__は任意のオブジェクトのデータ メンバであり (オブジェクトのクラスを含みます)、クラス オブジェクトを呼び出すとインスタンスが返されるため、 は のself.__class__()同じ(self.__class__)()クラスの新しいインスタンスを作成しようとしますが、selfコンストラクタには引数を渡しません。

  2. あなたはPythonでプログラミングしていません

2 番目のエラーは非常に大きなエラーであり、できるだけ早く修正する必要があります。

Python では、たとえば 2d-point クラスを次のように記述します。

class P2d:
    def __init__(self, x, y):
        self.x = x
        self.y = y

そして好きではない

class P2d(object):
    def __init__(self, x, y):
        self._x = x
        self._y = y

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @property
    def y(self):
        return self._y

    @x.setter
    def y(self, value):
        self._y = value

このノイズはすべて、Python では楽しみのためだけに使用されているわけではありません (たとえば Java が行っているように)。単純にデータ メンバーから始めて、後で (そして本当に必要な場合にのみ) 、クラスのユーザーで何も変更する必要なく、getter/setter にx置き換えることができます。_x

データメンバーを設定および取得するだけのセッター/ゲッターのペアは、まったくナンセンスです。

Python 構文を使用して Java を記述することは、さまざまな理由から間違っています。多くのボイラープレート構文を入力して読み取るのが好きなためにJavaでプログラミングしたい場合は、Javaを使用してください。

于 2013-09-15T05:57:11.723 に答える
2

クラス名が Dog で、d が Dog のインスタンスである場合、次のようになります。

d.__class__() 

次と同等です。

(d.__class__)()

これは次と同等です:

(Dog)() 

これは次と同等です:

Dog()

同様に、python メソッドは実際にはクラス内の単なる関数であり、呼び出しは次のとおりであることを学びます。

d.bark() 

次と同等です。

(d.bark)()

これにより、python は d.bark を検索し、Dog クラスで関数が見つかった場合、python はその関数をメソッド (d を含むオブジェクトであり、d をメソッドに暗黙的に渡すことができるようにする) に変換し、次に pythonメソッドを返します。

(method_obj)()

次に、末尾の括弧がメソッドを実行します。

于 2013-09-15T05:37:52.460 に答える