我不知道标题是否正确描述了我的问题。也许这有点误导。我想用函数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()
作为变通方法,但这几乎是不必要的,因为您几乎总是知道要调用哪个类的静态方法(。