複数のクラスを利用するプログラムを書いています。一連の変数の値を決定する専用のクラスが1つあります。それから、これらの変数の値に他のクラスでアクセスできるようにしたいと思います。私のコードは次のようになります。
class ClassA(object):
def __init__(self):
self.var1 = 1
self.var2 = 2
def methodA(self):
self.var1 = self.var1 + self.var2
return self.var1
class ClassB(ClassA):
def __init__(self):
self.var1 = ?
self.var2 = ?
object1 = ClassA()
sum = object1.methodA()
print sum
ClassAを使用して2つの変数(var1とvar2)を初期化します。次にmethodAを使用してそれらを追加し、結果をvar1として保存します(これによりvar1 = 3およびvar2 = 2になると思います)。私が知りたいのは、ClassBがClassAからvar1とvar2の値を取得できるようにする方法ですか?
var1
およびvar2
は インスタンス変数 です。つまり、ClassBがアクセスするためにClassA
のインスタンスをClassB
に送信する必要があります。
class ClassA(object):
def __init__(self):
self.var1 = 1
self.var2 = 2
def methodA(self):
self.var1 = self.var1 + self.var2
return self.var1
class ClassB(ClassA):
def __init__(self, class_a):
self.var1 = class_a.var1
self.var2 = class_a.var2
object1 = ClassA()
sum = object1.methodA()
object2 = ClassB(object1)
print sum
一方、 クラス変数 を使用する場合は、object1をClassBにパラメーターとして送信せずにvar1とvar2にアクセスできます。
class ClassA(object):
var1 = 0
var2 = 0
def __init__(self):
ClassA.var1 = 1
ClassA.var2 = 2
def methodA(self):
ClassA.var1 = ClassA.var1 + ClassA.var2
return ClassA.var1
class ClassB(ClassA):
def __init__(self):
print ClassA.var1
print ClassA.var2
object1 = ClassA()
sum = object1.methodA()
object2 = ClassB()
print sum
ただし、クラス変数はそのクラスのすべてのインスタンスで共有されることに注意してください。
なぜこれをしたいのか説明できますか?
インスタンス変数/属性で遊んでいます。これは、あるクラスから別のクラスに移行しません(それらはClassA
でも、特定のinstance of ClassA
of ClassA()
)の作成時に作成したもの。あるクラスの変更を別のクラスに反映させたい場合、canクラス変数を使用します:
_class ClassA(object):
var1 = 1
var2 = 2
@classmethod
def method(cls):
cls.var1 = cls.var1 + cls.var2
return cls.var1
_
このシナリオでは、ClassB
はClassA
の値を継承から取得します。その後、_ClassA.var1
_、_ClassB.var1
_を介して、またはインスタンスClassA().var1
からでもクラス変数にアクセスできます(インスタンスメソッド_var1
_を追加していない場合)属性検索でクラス変数の前に解決されます。
これが実際に推奨する一連のアクションであるかどうかを知る前に、特定のユースケースについてもう少し知っておく必要があります...
class ClassA(object):
def __init__(self):
self.var1 = 1
self.var2 = 2
def method(self):
self.var1 = self.var1 + self.var2
return self.var1
class ClassB(ClassA):
def __init__(self):
ClassA.__init__(self)
object1 = ClassA()
sum = object1.method()
object2 = ClassB()
print sum