实例方法中的类变量更新/继承

时间:2017-05-24 07:06:48

标签: python class inheritance instance updates

我正在尝试更新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的值由用户在父类中输入的内容决定,所以我不能自己在子类中定义它。

谢谢你的帮助!

1 个答案:

答案 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

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