0

ファイル内にある次のコード例を参照してください。

classattr.py

class BaseClass(object):
    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2

    def somemethod(self):
        return "This is returned when I do Base.__dict__"

class ChildOfBaseClass(BaseClass):
    def __init__(self, param1, param2, param3, param4):
        super(ChildOfBaseClass, self).__init__(param1, param2)
        self.param3 = param3
        self.param4 = param4

    def somemethod(self, param3, param4):
        a = param3 + param4
        return a

インスタンスを作成する前に、クラスのすべての属性 ( などは属性と呼ばれると想定しています)param1を取得したいと考えています。param2コマンドにとdir(classattr.BaseClass)が表示されません。ただし、メソッドは返します。param1param2somemethod

次の理由で属性を取得しようとしています。モジュールclassattrは、クラスの名前が別のファイルにインポートされているclassattr.BaseClassclassattr.ChildOfBaseClass、関数への入力として提供されています。実行時にどちらであるかを判断し、インスタンスを作成するときに適切な入力 (param1前者のparam2場合、または後者の場合はすべてのパラメーター)param1を使用したいと考えています。param4私がこれを行うことを考えていた方法は、クラスがparam3属性として持っているかどうかを確認し、正しい入力でインスタンスを作成することです。確認する別の良い方法はありますか?別の方法は、param3andparam4を入力として持つことですBaseClass何もしない場合でも、常に 4 つのパラメーターすべてを入力としてインスタンスを作成します。しかし、それは物事を行う適切な方法とは思えません。

ありがとうございました。

4

3 に答える 3

2

__init__()実際にインスタンスを作成せずに、 で定義されているような、オブジェクトの作成後にのみ割り当てられるアトリビュートの名前を取得する実際の方法はありません。メソッドは何でも実行でき、__init__()インスタンスはクラスに含まれていないコードによってさらに修正されている可能性があります。したがって、インスタンスが持つ属性を知りたい場合は、インスタンスが必要です。

于 2012-06-04T00:31:40.523 に答える
2

インスタンスが作成される前には存在しないため、クラスがそのインスタンスに与えるインスタンス属性を知ることはできません。

ただし、クラスをインスタンス化するときに渡す必要があるパラメーターを知りたい場合は、クラスの__init__メソッドの呼び出しシグネチャを調べて、それが受け入れるパラメーターを確認できます。呼び出し署名の取得に関する情報については、ラムダのパラメーター数の決定を参照してください。

__init__インスタンス属性とパラメーターの間に固有の関係はないことに注意してください。次のようなクラスを作成できます。

class Foo(object):
    def __init__(self):
        self.someAttr = 10

. . . パラメータを受け取らずにインスタンス属性を定義します。(またはその逆、パラメーターを受け入れるがインスタンス属性を作成するためにそれらを使用しないクラス。)

于 2012-06-04T00:33:36.357 に答える
1

BrenBarn の回答は、問題の解決に役立つ可能性のあるいくつかのアイデアを示しています。用語に関する注意事項を追加したいと思いました。

Python では、オブジェクトの属性はその中に格納されている名前付きの値です (オブジェクトはほとんど「属性を持つもの」に他なりません)。それらはdotted.name構文で取得されます。

Python のクラスはオブジェクトです。したがって、それらには属性があります。最も重要なものは、classブロックで定義したすべての名前 (メソッドを含む) であり、クラス オブジェクトの属性になります。したがって、クラスの属性について尋ねると、クラス オブジェクト自体の属性を取得したいように聞こえますが、実際にはそうではありません。

実際にdir(classattr.BaseClass)行っていることの 1 つは、 の属性をclassattr.BaseClass検索することです。somemethod属性が見つかりましたが、見つからないparam1か、クラス objectの属性ではないparam2ためです。これらのインスタンスが作成されて初期化されると、インスタンスの属性になります。 BaseClassBaseClass

しかし、あなたが本当に__init__求めているように見えるのは、特定のクラスのメソッドの呼び出しシグネチャを見つける方法です。BrenBarn が指摘したように、多くの場合、クラスは引数から へのインスタンスの属性を単純に直接初期化するように作成されますが__init__、これが事実であるという保証はまったくありません。ただし、インスタンスを作成するためにクラスに渡す情報を知ることが目的の場合は、最終的に何が属性として格納されるかを知る必要はありません (気にする必要はありません)。メソッドの必須パラメーターです__init__

于 2012-06-04T02:34:30.660 に答える