如何使用函数调用内部/嵌套类



我不知道标题是否正确描述了我的问题。也许这有点误导。我想用函数func1调用ABC类中的类Decoder(在ABC类中(,但我无法实现。

class ABC():
def __init__(self):
super(ABC, self).__init__()

def func1(self):
encoder=self.Encoder(1)

class Encoder():
def __init__(self, vocab_size):
super(self.Encoder, self).__init__()
self.vocab_size = vocab_size
f = ABC()
f.func1()

它给了我这个错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-19-2b76a7e09b6e> in <module>
11             self.vocab_size = vocab_size
12 f = ABC()
---> 13 f.func1()
14 
<ipython-input-19-2b76a7e09b6e> in func1(self)
4 
5     def func1(self):
----> 6         encoder=self.Encoder(1)
7 
8     class Encoder():
<ipython-input-19-2b76a7e09b6e> in __init__(self, vocab_size)
8     class Encoder():
9         def __init__(self, vocab_size):
---> 10             super(self.Encoder, self).__init__()
11             self.vocab_size = vocab_size
12 f = ABC()
AttributeError: 'Encoder' object has no attribute 'Encoder'

我只用了自己。编码器,因为PyCharm告诉我";未解决的引用";然后我在没有自我的情况下尝试了一下,得到了这个错误:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-20-a9effce8ca1b> in <module>
11             self.vocab_size = vocab_size
12 f = ABC()
---> 13 f.func1()
14 
<ipython-input-20-a9effce8ca1b> in func1(self)
4 
5     def func1(self):
----> 6         encoder=self.Encoder(1)
7 
8     class Encoder():
<ipython-input-20-a9effce8ca1b> in __init__(self, vocab_size)
8     class Encoder():
9         def __init__(self, vocab_size):
---> 10             super(Encoder, self).__init__()
11             self.vocab_size = vocab_size
12 f = ABC()
NameError: name 'Encoder' is not defined

如何在不删除嵌套类结构的情况下实现此功能?

作为内部类,Encoder可以被视为ABC上的静态变量。因此,您可以像访问任何其他静态变量一样访问它:ABC.Encoder:

class ABC():
def __init__(self):
super(ABC, self).__init__()
def func1(self):
encoder=ABC.Encoder(1)

class Encoder():
def __init__(self, vocab_size):
super(ABC.Encoder, self).__init__()
self.vocab_size = vocab_size

请记住,当self是实例方法的第一个参数时,它指的是调用该方法的实例,而不是。在实例上调用静态方法通常被认为是一种糟糕的做法(尽管如果确实需要,可以使用instance.__class__.method()作为变通方法,但这几乎是不必要的,因为您几乎总是知道要调用哪个类的静态方法(。

最新更新