嵌套类 - 如何使用父类中的函数?

时间:2017-03-20 10:38:03

标签: python python-2.7 class oop inner-classes

如果我遇到这种情况:

class Foo(object):
    def __init__(self):
        self.bar = Bar()

    def do_something(self):
        print 'doing something'

    class Bar(object):
        def __init(self):
            self.a = 'a'

        def some_function(self):

我想在some_function函数中调用do_something函数,但是这个函数不属于该类,我该怎么做才能调用这个函数? 我不想在Foo()。do_something中使用它,还有其他选择吗? 我不想创建新实例

另一个例子:

class A(object):
    def __init__(self):
        self.content = 'abcdabcabcabc'
        self.b = self.B()
        self.c = self.C()    

    def some_function(self):
        print self.content

    class B(object):
        def foo(self):
            A.some_function()

    class C(object):
        def foo(self):
            A.some_function()

1 个答案:

答案 0 :(得分:0)

Python中的嵌套类没有实际用例,但是使用命名空间来限定某些类属性。在这种情况下,你根本不应该创建它们的实例。

如果你有嵌套类的实例,那么你得到的就是头疼 - 没有任何好处。 " Outter" class不会把它们视为特别的东西 - 这与C ++不同,它看起来就是这个模式的起源,嵌套类在整体上是对容器类的私有。

在Python中私有的概念完全按照约定完成,如果除了Foo之外没有其他代码应该使用Bar的实例,请通过调用_Bar并在文档。

除了嵌套之外,不会通过任何其他方式帮助Bar获取Foo的引用而不是通过其名称(好的,有使用描述符协议的方法,但它并不意味着这一点) - 如果你想在没有Foo实例的情况下运行Foo.do_something,那么do_something应该是一个类方法。

现在,如果你想拥有聚合的对象,那就另当别论了。你要做的是:

class Bar(object):
    def __init(self, parent):
        self.parent = parent
        self.a = 'a'

    def some_function(self):
        self.parent.do_something(...)

class Foo(object):
    def __init__(self):
        self.bar = Bar(self)

    def do_something(self):
        print 'doing something'