2016-08-04 11 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 

私が知っています。 ClassA.define()ClassB.get_val()から明示的に呼び出すと、希望の値が得られます。しかし、私はそれが持っている価値を転ばそうとしています(Result: line 2

答えて

1

あなたはget_val方法でself.MCVE = classA()を設定するときは、classA新しいインスタンスするMCVEを設定しています。したがって、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 

あなたはそれ以外の場合は、クラスの__init__で設定することができpropertyを、使用するために探していてもよいです。

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 

もう一度正常に動作します。編集済みMCVEから作業

+0

私のせいです。 'row_num'行を追加しようとすると2番目の例で' treeview() 'の中に追加しました。これは' main'から呼び出されたときに常に0を返します。例が編集されます。見てください。 – BaRud