我已经检查过很多回复的问题,但无法从另一个类访问实例变量(我已经尝试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
)
答案 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
然后再次正常工作。