1. ホーム
  2. python

[解決済み] Pythonでクラスのメンバ変数にアクセスする?

2022-03-08 08:42:59

質問

class Example(object):
    def the_example(self):
        itsProblem = "problem"

theExample = Example()
print(theExample.itsProblem)

クラスの変数にアクセスするにはどうしたらいいですか? この定義を追加してみました。

def return_itsProblem(self):
    return itsProblem

しかし、これも失敗です。

解決方法は?

その答えを一言で言うと

あなたの例では itsProblem はローカル変数です。

を使用する必要があります。 self を使用してインスタンス変数を設定および取得します。設定するのは __init__ メソッドを使用します。そうすると、あなたのコードはこうなります。

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

しかし、真のクラス変数が欲しいのであれば、クラス名を直接使ってください。

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)
print (Example.itsProblem)

しかし、これには注意が必要です。 theExample.itsProblem と同じになるように自動的に設定されます。 Example.itsProblem が、全く同じ変数ではなく、独立して変更することが可能です。

いくつかの説明

Pythonでは、変数を動的に作成することができます。そのため、以下のようなことが可能です。

class Example(object):
    pass

Example.itsProblem = "problem"

e = Example()
e.itsSecondProblem = "problem"

print Example.itsProblem == e.itsSecondProblem 

印刷物

したがって、これまでの例と全く同じことをするわけです。

確かに、Pythonでは self として this が、もう少しだけ。 self は、どのようなオブジェクトメソッドでも最初の引数は常にオブジェクト参照だからです。これは自動的で、あなたがそれを self を使うかどうかです。

ということは、できるんですね。

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

または

class Example(object):
    def __init__(my_super_self):
        my_super_self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

全く同じです。 ANYオブジェクトメソッドの第1引数は現在のオブジェクトであり、我々はそれを呼び出すだけです。 self という慣例があります。 そして、このオブジェクトにただの変数を追加するのですが、これは外からやるのと同じ方法です。

さて、クラス変数についてです。

するとき。

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

最初に クラス変数を設定します。 にアクセスし、次に オブジェクト (インスタンス) 変数 . このオブジェクト変数を設定したことはないのですが、動作しています。

Pythonはまずオブジェクト変数を取得しようとしますが、見つからなければクラス変数を渡します。 警告: クラス変数はインスタンス間で共有され、オブジェクト変数は共有されません。

結論として、クラス変数を使ってオブジェクト変数にデフォルト値を設定することは絶対にしないでください。使用方法 __init__ を使用します。

やがて、Pythonのクラスはインスタンスであり、したがってオブジェクトそのものであることを学ぶと、上記の理解に新たなヒントを与えてくれるでしょう。そのことに気づいたら、後でまたこれを読みに来てください。