我正在尝试更新类 A 中的变量并使用类 B 中的更新信息。因此,我有两个问题:1)如何在实例方法中更新类变量?2) 如何使用父类的继承变量?
该程序的主要思想是用户输入名称和名称var,其值csv_name_sub
将被保存和更新并在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
是在父类中创建的,其值不会在子类中继承。但是如何访问子类中的变量值呢?由于csv_name_sub
的值由用户在父类中输入的内容决定,因此我无法自己在子类中定义它。
感谢您的帮助!
在代码中,当您在类 B__init__
初始化类 A 时,未设置类 A 的csv_name_sub
,因为它不在类 A的__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 个不同的classA 和类 B 对象,然后想要复制该值,在这种情况下,您必须修改classB.__init__
,以便它将 classA obj 作为参数并初始化自身。(在这种情况下,请确保在从类 A 对象创建类 B 对象之前调用 set_csv)或者将 csv 作为 classA 的静态变量,并编写一个方法来修改该变量。此变量可由类/继承类访问,并且跨所有类复制一个类中的修改。请注意,此变量不会绑定到类对象,尽管您可以从任何子类访问该变量,但尝试从子类修改变量将返回与该类关联的新静态变量,并且父类变量不会更改。 前任:
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
我希望这有助于解决您的问题。