2015-11-24 187 views
1

假设您有两个类AB。类B在类A中定义。我想在内部类中访问外部类的变量和方法。这里的代码是一个玩具的例子,但有什么我想证明要领:嵌套类:从内部类访问外部类的方法

class A: 
    a = 'even' 
    b = 'odd' 
    class B: 
    def __init__(self, n): 
     if n%2 == 0: self.num = a 
     if n%2 == 1: self.num = b 
     self.description = A.desc() 

    def __getitem__(self, i): 
    return self.B(i) 

    def desc(self): 
    return a + '-' + b 

>>> c = A() 
>>> d = c[4] 
>>> TypeError: unbound method desc() must be called with A instance as first argument (got nothing instead) 

这里desc确实在类A的变量的一些工作,并产生输出的方法。因为您没有定义description变量,所以类A已正确初始化,您可以访问变量ab,即使是从内部作用域也是如此。但是,我找不到调用外部作用域类方法desc的方法。是否可以在B中使用desc方法而不实例化类A

解释为什么我用这样的模式:在我的程序 变量ab是相当大的。我只需要初始化它们一次。另外,我不希望这些变量浮动在程序中,而只能被内部类访问。除此之外,我还可以在需要时使用A.__getitem__来提取大数据的'切片'。因此,外部类为我提供了隐藏/封装数据,索引操作符(通过__getitem__)以及提取数据片所需的所有例程(这里的方法desc。内部类B提供了有用信息的捆绑从每个指数的大数据来看,这很可能不是实现所描述任务的最佳设计,我很乐意听取您对于替代模式的意见

回答

1

我看不到任何理由你可以在这里使用类,更不用说嵌套类了。无论如何,几乎从来没有理由在Python中嵌套类,因为内部类没有获得任何特殊的外部类访问权限

但是,如果你要允许任何东西,而不实例化对象访问的方法,你可以把它一类方法:

@classmethod 
def desc(self): 
    return a + '-' + b 

,但我看不出为什么你会做任何这一点。此外,这里没有任何关闭。

+0

我接受这个答案,因为'@ classmethod'在很大程度上解决了我的问题。我将术语“封闭”改为“嵌套”。我做了一个快速搜索,实际上这不是封闭的例子,所以谢谢!我添加了解释为什么我使用这种嵌套模式。 –