我正在尝试更新classA中的变量并使用classB中的更新信息。因此我有两个问题: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
的值由用户在父类中输入的内容决定,所以我不能自己在子类中定义它。
谢谢你的帮助!
答案 0 :(得分:1)
在您的代码中初始化B类__init__
中的 classA 时, classA 的csv_name_sub
未设置,因为它'不在 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个不同的 classA和B类对象,然后想要复制该值,否则这将有效。在这种情况下,您必须修改classB.__init__
以便它& #39; ll将classA obj作为参数并初始化自己。 (在这种情况下,确保在从类A对象创建classB对象之前调用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
我希望这有助于解决您的问题。