假设您有两个类A
和B
。类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
的变量做了一些工作并产生输出。正确初始化类A
,您可以访问变量a
和b
,甚至可以从内部作用域访问,前提是您没有定义description
变量。但是,我找不到一种方法来调用外部范围类方法desc
。是否可以在desc
中使用方法B
而无需实例化类A
?
解释我使用这种模式的原因:
我程序中的变量a
和b
相当大。我只需要初始化一次。另外,我不希望这些变量在程序中浮动,而只能访问内部类。除此之外,我还可以使用A.__getitem__
在需要时提取大数据的“切片”。所以外层类为我提供了数据的隐藏/封装,索引操作符(通过__getitem__
)以及提取数据切片所需的所有例程(这里是方法desc
。内部类, B
,提供来自每个索引的大数据的有用信息的捆绑。这很可能不是实现所描述任务的最佳设计。我很开放并渴望听取您对替代模式的看法。
答案 0 :(得分:1)
我看不出你在这里使用类的任何理由,更不用说嵌套了。在任何情况下,几乎没有理由在Python中嵌套类,因为内部类没有获得对外部类的任何特殊访问。
但是,如果要在不实例化对象的情况下允许任何内容访问方法,可以将其作为类方法:
@classmethod
def desc(self):
return a + '-' + b
但我不明白为什么你会这样做。此外,这里没有任何内容。