嵌套 classes:从内部访问外部 class 的方法
Nested classes: Accessing the methods of the outer class from the inner one
假设您有两个 class,A
和 B
。 Class B 在 class A 内部定义。我想在内部 class 内部访问外部 class 的变量和方法。这里的代码是一个玩具示例,但具有我想要演示的要点:
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
对 class A
的变量做了一些工作并产生了输出。 Class A
已正确初始化,您可以访问变量 a
和 b
,即使您没有定义 description
,即使是从内部范围多变的。但是,我找不到调用外部范围 class 方法 desc
的方法。不实例化class A
是否可以在B
中使用方法desc
?
关于我为什么使用这种模式的解释:
我程序中的变量 a
和 b
相当大。我只需要初始化它们一次。另外,我不希望这些变量在程序中四处浮动,而只能被内部class访问。除了所有这些之外,我还可以在需要时使用 A.__getitem__
来提取大数据的 'slices'。所以外部 class 为我提供了 hiding/encapsulation 的数据,索引运算符(通过 __getitem__
)和提取数据切片所需的所有例程(这里的方法 desc
。内部 class、B
为每个索引提供了来自大数据的有用信息的捆绑。这很可能不是实现所描述任务的最佳设计。我很开放并且渴望听到您对替代模式的意见。
我看不出有任何理由让您在这里使用 classes,更不用说嵌套的了。在任何情况下,几乎没有理由将 classes 嵌套在 Python 中,因为内部 classes 没有对外部 class 的任何特殊访问权限。
然而,如果你想允许任何东西在不实例化对象的情况下访问一个方法,你可以使它成为一个class方法:
@classmethod
def desc(self):
return a + '-' + b
但我不明白你为什么要这样做。此外,这里没有任何内容是闭包。
假设您有两个 class,A
和 B
。 Class B 在 class A 内部定义。我想在内部 class 内部访问外部 class 的变量和方法。这里的代码是一个玩具示例,但具有我想要演示的要点:
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
对 class A
的变量做了一些工作并产生了输出。 Class A
已正确初始化,您可以访问变量 a
和 b
,即使您没有定义 description
,即使是从内部范围多变的。但是,我找不到调用外部范围 class 方法 desc
的方法。不实例化class A
是否可以在B
中使用方法desc
?
关于我为什么使用这种模式的解释:
我程序中的变量 a
和 b
相当大。我只需要初始化它们一次。另外,我不希望这些变量在程序中四处浮动,而只能被内部class访问。除了所有这些之外,我还可以在需要时使用 A.__getitem__
来提取大数据的 'slices'。所以外部 class 为我提供了 hiding/encapsulation 的数据,索引运算符(通过 __getitem__
)和提取数据切片所需的所有例程(这里的方法 desc
。内部 class、B
为每个索引提供了来自大数据的有用信息的捆绑。这很可能不是实现所描述任务的最佳设计。我很开放并且渴望听到您对替代模式的意见。
我看不出有任何理由让您在这里使用 classes,更不用说嵌套的了。在任何情况下,几乎没有理由将 classes 嵌套在 Python 中,因为内部 classes 没有对外部 class 的任何特殊访问权限。
然而,如果你想允许任何东西在不实例化对象的情况下访问一个方法,你可以使它成为一个class方法:
@classmethod
def desc(self):
return a + '-' + b
但我不明白你为什么要这样做。此外,这里没有任何内容是闭包。