web-dev-qa-db-ja.com

クラス間で変数にアクセスするにはどうすればよいですか?

複数のクラスを利用するプログラムを書いています。一連の変数の値を決定する専用のクラスが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の値を取得できるようにする方法ですか?

26
user2714543

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

ただし、クラス変数はそのクラスのすべてのインスタンスで共有されることに注意してください。

43
Steinar Lima

なぜこれをしたいのか説明できますか?

インスタンス変数/属性で遊んでいます。これは、あるクラスから別のクラスに移行しません(それらは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
_

このシナリオでは、ClassBClassAの値を継承から取得します。その後、_ClassA.var1_、_ClassB.var1_を介して、またはインスタンスClassA().var1からでもクラス変数にアクセスできます(インスタンスメソッド_var1_を追加していない場合)属性検索でクラス変数の前に解決されます。

これが実際に推奨する一連のアクションであるかどうかを知る前に、特定のユースケースについてもう少し知っておく必要があります...

6
mgilson
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
1
jackzhai