49

我正在编写一个使用多个类的程序。我有一个类专门用于确定一组变量的值。然后我希望能够使用其他类访问这些变量的值。我的代码如下所示:

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 的值?

4

6 回答 6

76

var1并且var2实例变量。这意味着您必须发送 to 的实例ClassA才能ClassB让 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

另一方面 - 如果您要使用类变量,您可以访问 var1 和 var2 而无需将 object1 作为参数发送给 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

但是请注意,类变量在其类的所有实例之间共享。

于 2013-11-15T04:59:33.303 回答
10

你能解释一下你为什么要这样做吗?

您正在使用不会从一个类迁移到另一个类的实例变量/属性(它们甚至不绑定到,而是绑定到您在编写时创建的ClassA特定实例)。如果您想让一个类中的更改显示在另一个类中,您可以使用类变量:ClassAClassA()

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

在这种情况下,将从继承ClassB中获取值。ClassA然后,您可以通过ClassA.var1ClassB.var1甚至从实例访问类变量ClassA().var1(前提是您没有添加var1将在属性查找中的类变量之前解析的实例方法。

在我知道这是否是我实际上会推荐的行动方案之前,我必须更多地了解您的特定用例......

于 2013-11-15T05:00:47.223 回答
2

var1 和 var2 是ClassA的实例变量。创建 ClassB 的实例,当调用 methodA 时,它将首先检查子类(ClassB )中的 methodA ,如果ClassB中不存在methodA ,则需要使用super() 方法调用ClassA ,这将为您提供所有方法在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):
        super().__init__()
        print("var1",self.var1)
        print("var2",self.var2)


object1 = ClassB()
sum = object1.methodA()
print(sum)

于 2020-08-29T14:44:44.930 回答
1
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
于 2013-11-15T05:57:43.457 回答
1

我们可以使用对象引用从一个类访问/传递参数/变量到另一个类。

#Class1
class Test:
    def __init__(self):
        self.a = 10
        self.b = 20
        self.add = 0

    def calc(self):
        self.add = self.a+self.b

#Class 2
class Test2:
    def display(self):
        print('adding of two numbers: ',self.add)
#creating object for Class1
obj = Test()
#invoking calc method()
obj.calc()
#passing class1 object to class2
Test2.display(obj)
于 2020-01-19T05:07:56.697 回答
1

只需在类中创建变量。然后从该类继承以访问其变量。但在访问它们之前,必须调用父类来启动变量。

class a:
    def func1(self):
        a.var1 = "Stack "

class b:
    def func2(self):
        b.var2 = "Overflow"

class c(a,b):
    def func3(self):
        c.var3 = a.var1 + b.var2
        print(c.var3)

a().func1()
b().func2()
c().func3()
于 2020-11-30T08:40:49.937 回答