2017-05-24 52 views
0

我試圖更新classA中的變量並使用classB中的更新信息。因此我有兩個問題:1)如何更新實例方法中的類變量? 2)如何使用父類的繼承變量?類變量更新/繼承實例方法

本方案的主要思想是,用戶輸入的名稱,該名稱變種,它的值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

錯誤是因爲'csv_name_sub'沒有在主要定義的位置。像'root = Tk()'你應該定義'csv_name_sub'。 – Pavan

+0

我不太明白這一點_我認爲這是由於var的值csv_name_sub在用戶輸入後沒有更新,並且正確地繼承到classB您如何期待創建子類並將值從父類繼承?你沒有創建一個'ClassB'對象。 – Pavan

+0

@Pavan感謝您的評論!請注意,我在這裏混淆了措詞。我的主要想法是我想使用classB中classA中創建的var'csv_name_sub'的值。我知道它的值不會在classB中繼承,因爲它不是在classB中創建的。那麼我怎麼能找到一種方法來在子類中使用'csv_name_sub'的值(在父類中創建)呢? – Kay

回答

1

在你的代碼,當你在B類__init__初始化CLASSA,該CLASSA的csv_name_sub沒有設置,因爲它不是代碼的__init__的CLASSA內

我有這樣的代碼,它的工作原理:

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類對象創建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 

我希望這有助於解決您的問題。