web-dev-qa-db-fra.com

Comment accéder aux variables d'une classe à une autre?

J'écris un programme qui utilise plusieurs classes. J'ai une classe qui est dédiée à la détermination des valeurs pour un ensemble de variables. J'aimerais ensuite pouvoir accéder aux valeurs de ces variables avec d'autres classes. Mon code se présente comme suit:

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

J'utilise classA pour initialiser 2 variables (var1 et var2). J'utilise ensuite methodA pour les ajouter, en enregistrant le résultat sous var1 (je pense que cela fera var1 = 3 et var2 = 2). Ce que je veux savoir, c'est comment ClassB pourrait-il alors obtenir les valeurs de var1 et var2 à partir de ClassA?

26
user2714543

var1 et var2 sont variables d'instance . Cela signifie que vous devez envoyer l'instance de ClassA à ClassB pour que ClassB puisse y accéder, c'est-à-dire:

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

D'autre part, si vous utilisiez variables de classe , vous pourriez accéder à var1 et var2 sans envoyer object1 en tant que paramètre à ClassB.

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

Notez cependant que les variables de classe sont partagées par toutes les instances de sa classe.

43
Steinar Lima

Pouvez-vous expliquer pourquoi vous voulez faire cela?

Vous jouez avec des variables/attributs d'instance qui ne migreront pas d'une classe à une autre (ils ne sont même pas liés à ClassA, mais à une instance particulière de ClassA que vous avez créée en écrivant ClassA()). Si vous souhaitez que les modifications d'une classe apparaissent dans une autre, vous pouvez utiliser des variables de classe:

class ClassA(object):
   var1 = 1
   var2 = 2
   @classmethod
   def method(cls):
       cls.var1 = cls.var1 + cls.var2
       return cls.var1

Dans ce scénario, ClassB récupérera les valeurs sur ClassA à partir de l'héritage. Vous pouvez ensuite accéder aux variables de classe via ClassA.var1, ClassB.var1 Ou même à partir d'une instance ClassA().var1 (à condition que vous n'ayez pas ajouté de méthode d'instance var1 qui sera résolu avant la variable de classe dans la recherche d'attribut.

Je devrais en savoir un peu plus sur votre cas d'utilisation particulier avant de savoir s'il s'agit d'un plan d'action que je recommanderais réellement ...

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