答えは、一言で言えば
あなたの例で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オブジェクトメソッドの最初の引数は現在のオブジェクトでありself
、慣例としてのみ呼び出します。そして、外部から行うのと同じ方法で、このオブジェクトに変数だけを追加します。
さて、クラス変数について。
あなたがするとき:
class Example(object):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
最初にクラス変数を設定し、次にオブジェクト(インスタンス)変数にアクセスします。このオブジェクト変数を設定することはありませんが、機能します。どうすればそれが可能ですか?
さて、Pythonは最初にオブジェクト変数を取得しようとしますが、それが見つからない場合は、クラス変数を取得します。警告:クラス変数はインスタンス間で共有されますが、オブジェクト変数は共有されません。
結論として、クラス変数を使用してデフォルト値をオブジェクト変数に設定しないでください。__init__
そのために使用します。
最終的には、Pythonクラスがインスタンスであり、したがってオブジェクト自体であることがわかります。これにより、上記を理解するための新しい洞察が得られます。気づいたら、戻って後でもう一度読んでください。