2016-08-04 146 views
0

我已簽了很多問題回答這裏,但無法從其他類訪問實例變量(我曾嘗試this爲例)廣東話訪問實例變量

#in file: view.py 
class treeview(): 
    def __init__(self): 
     ....(no mention of row_num) 
    def viewer(self, booklist, act=-1): 
     row_num = len(treeview().full_list) 
     print(row_num) # prints the correct value, which is > 0 
     return row_num 

#in main file 
class Window(Gtk.ApplicationWindow): 
    def __init__(self, application, giofile=None): 
     self.TreeView = view.treeview() 
    def extract_data_from_cr(self, select_button): 
     print(self.TreeView.row_num) 

給出錯誤:

AttributeError: 'treeview' object has no attribute 'row_num' 

如果我嘗試添加row_num內樹視圖()爲:

class treeview(): 
    def __init__(self): 
     self.row_num = 0 
    def viewer(self, booklist, act=-1): 
     self.row_num = len(treeview().full_list) 
     print(self.row_num) 
     # return row_num 

然後,print(self.TreeView.row_num)main總是產生0

我無法找到這裏出了什麼問題。善良的幫助。

米奇的評論後 如果我定義ROW_NUM不調用樹視圖()再次爲:

class treeview(): 
    def __init__(self): 
     self.row_num = 0 
    def viewer(self, booklist, act=-1): 
     self.row_num = len(self.bookstore) 
     print(type(self.bookstore)) # <class 'gi.overrides.Gtk.ListStore'> 

     print(self.row_num) # 5 (expected for a particular case) 

現在,調用def extract_data_from_cr的時候,我期待這個數字:

def extract_data_from_cr(self, select_button): 
    print(self.TreeView.row_num) #is giving 0 

A MCVE

$cat mcve.py 
class classA(): 
    def __init__(self): 
     self.row_num = 0 
     print("HiA") 
    def define(self): 
     la = ["A", "B", "C"] 
     self.row_num = len(la) 
     print(self.row_num) #prints 3 when get called from mcve2 
     return(self.row_num) 
classA().define() 

$cat mcve2.py 
#!/usr/bin/python 
import mcve 

class classB(): 
    def get_val(self): 
     self.MCVE = mcve.classA() 
     print("Hi2") 
     print(self.MCVE.row_num) #prints 0 

classB().get_val() 

結果:

python3 mcve2.py 
HiA 
3 
HiA 
Hi2 
0 

我知道。如果我從ClassB.get_val()明確地撥打ClassA.define(),我會得到期望的值。但我正在尋找轉化它的價值(Result: line 2

回答

1

從您的編輯工作MCVE:

當您在get_val方法設置self.MCVE = classA(),要設置MCVE是一個新實例的classA。因此,classA的某個其他實例的row_num屬性的任何修改都是無關緊要的。

例如classA().define()正在修改完全不同的類實例的row_num屬性。它的row_num是一個實例變量,它只被定義爲,特定實例

如果您希望row_num屬性在所有classA實例中保持不變,您可能希望將其設置爲類變量,就像這樣(儘管它是一個無意義的示例)。

class classA(): 
    row_num = 0 

    def __init__(self): 
     print("HiA") 
    def define(self): 
     la = ["A", "B", "C"] 
     classA.row_num = len(la) 
     print(classA.row_num) #prints 3 when get called from mcve2 
     return classA.row_num 
classA().define() 

class classB(): 
    def get_val(self): 
     self.MCVE = classA() 
     print("Hi2") 
     print(self.MCVE.row_num) #prints 0 

classB().get_val() 

輸出

HiA 
3 
HiA 
Hi2 
3 

,否則你可能會尋找使用property,這可能在類的__init__進行設置。

0

您從未在類中聲明row_num。你可能的意思是做

class treeview(): 
    def __init__(self): 
     ....(no mention of row_num) 
    def viewer(self, booklist, act=-1): 
     self.row_num = len(treeview().full_list) 
     print(self.row_num) # prints the correct value 
     return self.row_num 

然後再工作正常。

+0

我的錯。實際上,在我的第二個例子中,'如果我嘗試添加row_num'行,我已經在'treeview()'中添加了它,當從'main'調用時它總是產生0。示例已編輯。請看一看。 – BaRud