使用另一个类中的函数调用一个类中的函数

时间:2018-12-06 12:15:42

标签: python python-3.x

我正在做一些工作,并且不断遇到问题。我尝试了大约一个小时来解决这个问题,但我无法解决。 这是我的问题的简化版本;

import random
class class1(object):
    def __init__(self):
        super(class1,self).__init__()
        self.createX()
    def createX(self):
        self.x = random.randint(1,20)

class class2(class1):
    def __init__(self):
        super(class2,self).__init__()
        self.n = 4
    def create(self):
        self. n = self.n + self.x

class main(object):
    def __init__(self,c,c2):
        self.x = c
        self.n = c2

        self.x = self.x.x
        self.n = self.n.n

        self.print()
        self.createnew()
        self.print()
    def print(self):
        print('x=',self.x)
        print('n',self.n)

    def createnew(self):
        c = class1()
        c2 = class2()
        c2.create()


c = class1()
c2 = class2()
c2.create()

m = main(c,c2)

我上了3堂课。 Class1只是使用随机函数创建一个名为self.x的变量。 下一个class2创建另一个名为self.n的变量。这两个类使用继承互连,到目前为止,一切正常。然后,我有一个主类,该主类从其他类中获取所有变量,并在其自己的类中使用它。它具有两个功能:一个会打印,另一个会再次调用类。 当我运行程序时,将打印此内容:

x= 7
n 7
x= 7
n 7

即使我在主类中使用“ createnew”功能调用了创建它们的类,我也不明白为什么第二轮x和n不会更改值。

我们非常感谢您的帮助。谢谢

2 个答案:

答案 0 :(得分:5)

createnew()没有意义。它会创建新的局部变量并将其丢弃。

def createnew(self):
    c = class1()
    c2 = class2()
    self.c2.create()

cc2仅在createnew本地。它们与创建c类实例的c2main没有关系,并且不会更改。

您应保留对“原始” cc2的引用:

class main(object):
    def __init__(self,c,c2):
        self.c = c
        self.c2 = c2

        self.x = self.c.x
        self.n = self.c2.n

    def createnew(self):
        self.c = class1()
        self.c2 = class2()
        self.c2.create()
        self.x = self.c.x
        self.n = self.c2.n

您可以不保留cc2而只更新self.xself.n,但是这有点奇怪:

class main(object):
    def __init__(self, c, c2):
        self.x = c
        self.n = c2

        self.x = self.x.x
        self.n = self.n.n

    def createnew(self):
        c = class1()
        c2 = class2()
        c2.create()
        self.x = c.x
        self.n = c2.n

答案 1 :(得分:1)

已经有一个很好的答案,解释为什么这不起作用。 我遇到了同样的问题,并找到了一种始终可以工作并链接不同类的方法:

var y = x.Where(i => i % 2 == 0);

为此,您需要一个MainClass来保持与所有其他类的连接。它创建对Class1和Class2的引用,并将自身作为参数传递给这些类。