【问题标题】:Python: Using properties of an outer classPython:使用外部类的属性
【发布时间】:2016-03-31 18:30:31
【问题描述】:

我有一些看起来像这样的代码:

class Log(object):
    @property
    def log(self):
        return self.log

class ExampleClass2(ExampleClass, Log):
    class ExampleClass3(object):
        @property
        def log_value(self):
            self.log.info('Hi!')

但是我遇到了一个错误,

'ExampleClass3' object has not attribute 'log'

我猜我需要在 DEF 中添加一个__init__() 方法,并且我尝试过使用

super(ExampleClass2.ExampleClass3, self).__init__()

但我仍然无法访问 log。有什么建议么?

【问题讨论】:

  • 不要使用嵌套类。几乎没有理由这样做。
  • 也就是说print_banana属于DEF类,它继承了object,所以它没有从BaseClass1类继承print
  • 一个类定义在另一个类中并不意味着任何一个类都是另一个类的后代。
  • 您需要提供导致您遇到的错误的代码的最小示例。如果您在print_banana 方法定义前添加def,您提供的代码将运行良好。
  • print 'banana' 表示您正在使用没有from __future__ import print_function 的Python 2,因此print 是一个不能用作属性名称的关键字,就像您在此处所做的那样。

标签: python inner-classes


【解决方案1】:

我相信要获得您想要的行为,您需要在创建ExampleClass3 的实例时传入ExampleClass2 的实例。

class OuterClass:
    def __init__(self, value):
        self.value = value

    class InnerClass:
        def __init__(self, instance):
            self.instance = instance

        def inner_print_value(self):
            print self.instance.value

    def outer_print_value(self):
        printer = OuterClass.InnerClass(self)
        printer.inner_print_value()

OuterClass('Hi').outer_print_value() # 'Hi'

正如 cmets 中所述,这种结构很少有原因。在OuterClass 的定义之外创建InnerClass 会更容易。

class OuterClass:
    def __init__(self, value):
        self.value = value

    def outer_print_value(self):
        printer = InnerClass(self)
        printer.inner_print_value()

class InnerClass:
    def __init__(self, instance):
        self.instance = instance

    def inner_print_value(self):
        print self.instance.value

您似乎希望在创建内部类时增加 self 的值,但事实并非如此。为此,您需要使用继承,这也不需要嵌套类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多