如何将变量从一个 class 传递到另一个?

how can I pass variables from one class to another?

我更新了这个问题。我正在创建两个 windows 并尝试将在 class A 中创建的变量传递给 class B。请您指出我的代码中的问题是什么?这是我的方法:

class Welcome:

       def __init__(self, master, csv_name_sub, csv_name_ses):
            self.entrySes = Entry(self.master, bg="LemonChiffon3")  
            self.entrySub=Entry(self.master,bg="LemonChiffon3")
            self.csv_name_sub = str(self.entrySub.get())
            self.csv_name_ses = str(self.entrySes.get())
            #here users enter some info, they are saved to be used as file name the in following class

class App(Welcome):
       def __init__(self, master):
            Welcome.__init__(self, master, csv_name_ses, csv_name_sub)  #I'm trying use this line to pass the variables from the first class 
            print('session is', self.csv_name_ses)
            print("subject is", self.csv_name_sub)
            self.resultFile = open(
            "C:\Users\xxx" + self.csv_name_sub + '_' + self.csv_name_ses +
        '_results.csv', 'w')
       #.....
       #other codes

def main():

    root = Tk()
    myApp = Welcome(root, csv_name_ses, csv_name_sub)
    root.mainloop()

if __name__ == '__main__':
    main()

程序可以是运行,但是变量csv_name_sescsv_name_sub不会传递给class App,因为它们不会在[=23]中打印出来=].

我也尝试了如下的Composition方法,还是无法解决问题:

class Welcome:
    def __init__(self, master, csv_name_sub, csv_name_ses):
            self.entrySes = Entry(self.master, bg="LemonChiffon3")  
            self.entrySub=Entry(self.master,bg="LemonChiffon3")
            self.csv_name_sub = str(self.entrySub.get())
            self.csv_name_ses = str(self.entrySes.get())

class App:
    def __init__(self, master, csv_name_ses, csv_name_sub):
           self.csv_name_sub = csv_name_sub
           self.csv_name_ses = csv_name_ses
           self.welcomePage = Welcome(master, csv_name_ses, csv_name_sub)
           print('session is', self.welcomePage.csv_name_ses)
           print("subject is", self.welcomePage.csv_name_sub)
    self.resultFile = open(
        "C:\Users\xxx + self.welcomePage.csv_name_sub + '_' + self.welcomePage.csv_name_ses +
        '_resultsofPart.csv', 'w')

问题是 Welcome class 需要实例化 3 个参数,而您只提供了一个 "root"。

由于Welcomeclass的构造函数是__init__(self, master, csv_name_sub, csv_name_ses),所以需要为csv_name_subcsv_name_ses提供一个值来实例化这个class。由于您实际上并未使用 csv_name_subcsv_name_ses 的传递值(请参阅 Welcome class 的 __init__ 函数的前 4 行),这可能是一个有效的解决方案:

class Welcome:

   def __init__(self, master):
        self.entrySes = Entry(self.master, bg="LemonChiffon3")  
        self.entrySub=Entry(self.master,bg="LemonChiffon3")
        self.csv_name_sub = str(self.entrySub.get())
        self.csv_name_ses = str(self.entrySes.get())
        #here users enter some info, they are saved to be used as file name the in following class

class App(Welcome):
   def __init__(self, master):
        Welcome.__init__(self, master) 
        print('session is', self.csv_name_ses)
        print("subject is", self.csv_name_sub)
        self.resultFile = open(
        "C:\Users\xxx" + self.csv_name_sub + '_' + self.csv_name_ses +
    '_results.csv', 'w')
   #.....
   #other codes

使用默认参数和 or 初始化 self 字段:

class Welcome:

    def __init__(self, master, csv_name_sub=None, csv_name_ses=None):
        self.entrySes = Entry(self.master, bg="LemonChiffon3")  
        self.entrySub=Entry(self.master,bg="LemonChiffon3")
        self.csv_name_sub = csv_name_sub or str(self.entrySub.get())
        self.csv_name_ses = csv_name_ses or str(self.entrySes.get())

在使用super class时,要从父class继承var和值,子class需要引用父class,这样Welcome.csv_name_ses.

class Welcome:

   def __init__(self, master, csv_name_sub, csv_name_ses):
        self.entrySes = Entry(self.master, bg="LemonChiffon3")  
        self.entrySub=Entry(self.master,bg="LemonChiffon3")
        writeToFile()

   def writeToFile(self):
        Welcome.csv_name_sub = str(self.entrySub.get())
        Welcome.csv_name_ses = str(self.entrySes.get())


class App(Welcome):
   def __init__(self, master, csv_name_ses, csv_name_sub):
        Welcome.__init__(self, master, csv_name_ses, csv_name_sub)
        self.csv_name_sub = Welcome.csv_name_sub
        self.csv_name_ses = Welcome.csv_name_ses  #parent.var

def main():

   root = Tk()
   myApp = Welcome(root, csv_name_ses, csv_name_sub)
   root.mainloop()