class 实例方法中的变量 update/inherit

class variable update/inherit in instance method

我正在尝试更新 classA 中的变量并使用 classB 中的更新信息。因此我有两个问题:1)如何在实例方法中更新 class 变量? 2) 如何使用从父级继承的变量 class?

这个程序的主要思想是用户输入名称,名称var,它的值csv_name_sub将被保存和更新并用于class B.(即用作文件姓名)

classA(object):
    def __init__(self, master, csv_name_sub):
        self.entrySub = Entry(self.master,bg="grey") #user enters sth
        button1 = Button(self.master,text='NEXT', command=self.gotoPage1)

    def writeToFile(self):
        self.csv_name_sub = str(self.entrySub.get()) #save value to var

    def gotoPage1(self):
        self.writeToFile()
        root2=Toplevel(self.master)
        self.instPage1=classB(root2)

classB(classA):
   def __init__(self, master, csv_name_sub):
        classA.__init__(self, master, csv_name_sub)
        print(self.csv_name_sub)
        self.resultFile = open(
         "/Users/" + self.csv_name_sub,'w')
        self.resultFileWrite = csv.writer(self.resultFile)

def main():

    root = Tk()
    myApp = classA(root, csv_name_sub)
    root.mainloop()

但是错误是:

    myApp = classA(root, csv_name_sub)
    NameError: name 'csv_name_sub' is not defined

我了解到 csv_name_sub 是在父 class 中创建的,它的值在子 class 中没有继承。但是如何访问子 class 中的变量值?因为 csv_name_sub 的值是由用户在父 class 中输入的内容决定的,所以我不能自己在子 class 中定义它。

感谢您的帮助!

在你的代码中初始化classA in __init__ of class B, The csv_name_sub of classA 未设置,因为它不在 classA

__init__ 代码内

我有这段代码并且有效:

class classA():
    def __init__(self, csv = ""):
        print "Inside classA init"

    def set_csv(self, csv):
        print "Setting csv to %s" %csv
        self.csv = csv

class classB(classA):
    def __init__(self,csv):
        print("Inside classB init")
        classA.__init__(self, csv)
        classA.set_csv(self, csv)
        print "class B csv after set_csv %s" %self.csv

my_class = classB("abc")

输出:

Inside classB init
Inside classA init
Setting csv to abc
class B csv after set_csv abc

这会起作用,除非你想创建 2 个 different classA 和 class B 对象然后复制值,在这个如果您必须修改 classB.__init__ 以便它将 classA obj 作为参数并初始化自身。 (在你的情况下,一定要在从 classA 对象创建 classB 对象之前调用 set_csv)或者将 csv 作为 classA 的静态变量,然后写修改该变量的方法。 class/ 继承的 classes 可以访问此变量,并且在一个 class 中进行修改会复制到所有 classes。请注意,此变量不会绑定到 class 对象,尽管您可以从任何子 class 访问该变量,但尝试从子 class 修改变量将 return 在与该 class 关联的新静态变量中,父 class 变量未更改。 例如:

class classA():
    csv = ""
    def __init__(self, csv = ""):
        print "Inside classA init"
        classA.csv = csv

class classB(classA):
    def __init__(self,csv):
        print "Inside classB init"
        classA.__init__(self, csv)

my_classA = classA("abc")
print classA.csv 
my_classB = classB("efg")
print classA.csv
print classB.csv   #same as classA's csv
classB.csv = "lmn" #inherited static csv is masked.
print classA.csv
print classB.csv   # no longer points to the classA's csv

输出:

Inside classA init
abc #initialized
Inside classB init
Inside classA init
efg #changed in Init of classB by calling init of classA
efg #classB.csv
efg #classA.csv after (classB.csv = "lmn")
lmn #classB.csv created a new static variable csv, masking the variable of classA

我希望这有助于解决您的问题。