【问题标题】:Use instance attributes of outer class instances in inner class在内部类中使用外部类实例的实例属性
【发布时间】: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 实例中。任何帮助将不胜感激,谢谢

【问题讨论】:

  • Nested classes' scope?的可能重复
  • 没有这样的“通用外部实例”。 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


【解决方案1】:

我不确定这是不是好的编程,但是您可以将外部类实例传递给内部类实例,然后从内部类的一个字段中访问它:

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, outer, n = 1, P = 0, w = 1, t = 0): # added outer to the constructor
            self.number = n
            self.power = P
            self.num_windows = w
            self.func_time = t
            self.outer = outer # added an 'outer' field

        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))
            self.outer.Inner_list.append(self) # accessing outer object as a field

#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(Out_instance_1, 5,7,2,5) # pass the outer object to the inner object
Inn_instance_1.windows([6*60,8*60],[18*60,23*60]) 

【讨论】:

    猜你喜欢
    • 2016-01-21
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多