无法从另一个类访问实例变量

时间:2016-08-04 09:41:26

标签: python-3.x

我已经检查过很多回复的问题,但无法从另一个类访问实例变量(我已经尝试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'

如果我尝试在treeview()中添加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

我在这里找不到什么问题。请帮助。

Mitch的评论之后 如果我定义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

2 个答案:

答案 0 :(得分: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__中设置。

答案 1 :(得分: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

然后再次正常工作。