2016-08-04 3 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 в TreeView() как:

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 без вызова TreeView() снова, как:

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

Работа с отредактированной MCVE:

При установке self.MCVE = classA() в методе get_val, вы настраиваете MCVE быть новый экземпляр из classA. Следовательно, любые изменения атрибута row_num какого-либо другого экземпляра classA не имеют значения.

например.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() ', который всегда выдает 0 при вызове из' main'. Пример редактируется. Пожалуйста, смотрите. – BaRud