【问题标题】:Python: use self.variable from outer class in inner nested classPython:在内部嵌套类中使用外部类的 self.variable
【发布时间】:2020-01-29 19:03:40
【问题描述】:

我正在尝试将我的函数组织到类中。我想在“内部”类中使用“外部”类的属性 self.file_list。

class Outer:
    """Outer Class"""
    def __init__(self, file_list):
        self.file_list=file_list
        ## instantiating the 'Inner' class
        self.inner = self.Inner()


    ## inner class
    class Inner:
        """First Inner Class"""
        def __init__(self):
            print (Outer.file_list)  <-- this line doesn't work 

            pass
clean =Outer (['cats', 'dogs'])

但是我得到了这个错误:

<ipython-input-63-0dfab321da74> in __init__(self)
     10         """First Inner Class"""
     11         def __init__(self):
---> 12             print (self.file_list)
     13 
     14             pass

AttributeError: 'Inner' object has no attribute 'file_list'

如何在内部 init 方法中访问 self.file_list 属性? 或者在一个类中将函数组合在一起的传统方法是什么?

【问题讨论】:

  • 内部类和外部类的实例之间没有隐式关系,所以你必须自己建立这种关系(例如在构造Inner时传递一个parent参数,做一个Outer 中的工厂函数,它设置了Inner 的成员等)或者根本不依赖这种关系,只传递你关心的数据。
  • 传统的方式是这样做。
  • 为什么不呢?创建内部类没有任何正当理由吗?例如,Django 在其许多类中都使用了内部 Meta 类。

标签: python class


【解决方案1】:

Outer 是类,file_list 是该类的实例属性。你不能访问Outer.file_list,因为它不存在。

创建Inner 的实例时,您需要传递Outer 父实例才能访问其成员。

将代码更改为:

class Outer:
    """Outer Class"""
    def __init__(self, file_list):
        self.file_list=file_list
        ## instantiating the 'Inner' class
        self.inner = self.Inner(self)


    ## inner class
    class Inner:
        """First Inner Class"""
        def __init__(self, outer_parent):
            print (outer_parent.file_list)

            pass

应该让它工作。

【讨论】:

  • 这是否会被常规使用?我不想开始做不正常的事情
  • 无论你用内部类可以实现什么,你也可以不用它们来实现。但是,内部类和这种类型的模式可用于构建您的代码,这是实现某些封装功能的一种完全有效的方式。有关内部类的方式和原因的更多详细信息,请参阅此问题:stackoverflow.com/questions/719705/…
猜你喜欢
  • 2014-02-11
  • 2011-09-07
  • 1970-01-01
  • 2014-10-30
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多