【问题标题】:How would I access variables from one class to another?我将如何访问从一个类到另一个类的变量?
【发布时间】:2013-11-28 09:59:22
【问题描述】:

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

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

【问题讨论】:

  • 如果你想要ClassB我们classA的属性之一呢?

标签: python class variables


【解决方案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()

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 欢迎来到 Stack Overflow!请注意,您正在回答一个非常古老且已经回答的问题。这是How to Answer 的指南。
    【解决方案3】:

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

    #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)
    

    【讨论】:

      【解决方案4】:
      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
      

      【讨论】:

        【解决方案5】:

        var1var2instance variables。这意味着您必须将 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
        

        另一方面,如果您要使用class variables,您可以访问 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
        

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

        【讨论】:

          【解决方案6】:

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

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

          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,该方法将在属性查找中的类变量之前解析。

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

          【讨论】:

          • 我真的只是为了练习。我正在尝试自学,而在上课时,这是我遇到的一个问题。我四处寻找,并不能真正理解其他答案。想我会试一试。我想我现在掌握了窍门!谢谢!
          猜你喜欢
          • 2015-11-22
          • 2020-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-28
          • 2023-04-07
          • 2020-11-24
          相关资源
          最近更新 更多