【发布时间】:2017-11-28 14:50:55
【问题描述】:
我正在尝试将内部类实例附加到一个列表中,该列表被定义为外部类实例的属性。但是我得到一个“AttributeError:类型对象'Outer'没有属性'Inner_list'”。代码如下:
import matplotlib.pyplot as plt
import numpy as np
#Create new outer class
class Outer():
def __init__(self, name = "", n_users = 1):
self.user_name = name
self.num_users = n_users
self.Inner_list = []
#Create new inner class
class Inner():
def __init__(self, n = 1, P = 0, w = 1, t = 0):
self.number = n
self.power = P
self.num_windows = w
self.func_time = t
def windows(self, w1 = np.array([0,0]), w2 = np.array([0,0])):
self.window_1 = w1
self.window_2 = w2
self.daily_hours = np.zeros(1440)
self.daily_hours[w1[0]:(w1[1])]=np.ones(np.diff(w1))
self.daily_hours[w2[0]:(w2[1])]=np.ones(np.diff(w2))
Outer.Inner_list.append(self)
#Create new instance of outer class
Out_instance_1 = Outer("outer",300)
#Create new instance of inner class
Inn_instance_1 = Out_instance_1.Inner(5,7,2,5)
Inn_instance_1.windows([6*60,8*60],[18*60,23*60])
Python 说 Outer 对象没有属性“Inner_list”,这是真的,因为我知道“Inner_list”是 Outer 实例的属性,而不是 Outer 对象的属性。如果我创建一个 Outer_instance 并键入“Outer_instance.App_list”,它会根据我的需要显示一个空列表。所以这里的问题是我无法让代码将 Inner 实例附加到定义它的通用 Outer 实例中。任何帮助将不胜感激,谢谢
【问题讨论】:
-
没有这样的“通用外部实例”。
Out_instance_1.Inner、Out_instance_2.Inner、Outer.Inner都是指同一个类,没有区别。也就是说,平面比嵌套更好。无论您试图解决什么问题,都可能有更好的方法。 -
感谢您的回复。我相信还有更好的方法,这就是我问的原因。无论如何,是的,如果我手动创建(在控制台中)一个新的 Outer 实例并输入“New_Outer_Instance.Appl_list”,它会正确显示我想要的空列表。但问题是,如果我尝试用脚本来做它不起作用,因为我事先不知道“New_Outer_Instance”的名称,我只知道它将是 Outer 类的一个实例,我认为这段代码会让 Python 理解它,但事实并非如此。有什么想法吗?
-
@FrancescoLombardi python 没有什么可以理解的,
Inner和它们的实例都与Outer的任何特定实例无关,所以你不能指望 python 神奇地找到一个。他们甚至不需要任何Outer的实例就可以存在。想法:尝试在不嵌套类的情况下解决问题,它只会让你感到困惑。有关更多想法,请查看@AndreyF 的答案,其中Outer的实例显式附加到Inner的每个实例。 -
@AndreyF 的想法完美运行,但仍然保持内部类的缩进,否则将无法正常工作。为什么说没有嵌套类更好?
标签: python class nested inner-classes