Python 如何最好地引用父类中的生成器函数?
我有一个类层次结构,在父类中,我有一个生成器函数,我有时需要按原样使用它。在派生类中,我有一个首选生成器。如果使用Python 如何最好地引用父类中的生成器函数?,python,python-3.x,Python,Python 3.x,我有一个类层次结构,在父类中,我有一个生成器函数,我有时需要按原样使用它。在派生类中,我有一个首选生成器。如果使用super()将父生成器函数指定给变量(即指向函数的指针),则会出现以下错误: Traceback (most recent call last): File "foo.py", line 22, in <module> for i in baz.generator(): File "foo.py", line 11, in generator f
super()
将父生成器函数指定给变量(即指向函数的指针),则会出现以下错误:
Traceback (most recent call last):
File "foo.py", line 22, in <module>
for i in baz.generator():
File "foo.py", line 11, in generator
for i in self.f():
AttributeError: 'bar' object has no attribute 'f'
这些评论很有帮助。以下两行更改解决了此问题:
class bar(foo): # derived
def generator(self, override=True):
f = self.generator2 if override else super().generator
for i in f():
yield i
更改为
bar.generator的self.generator2
,super()
的foo
和f(self)
的f()
,因为f
现在引用了对象中的方法。注释非常有用。以下两行更改解决了此问题:
class bar(foo): # derived
def generator(self, override=True):
f = self.generator2 if override else super().generator
for i in f():
yield i
更改为bar.generator的self.generator2
,super()
的foo
和f(self)
的f()
,因为f
现在引用对象中的方法。您在哪里尝试使用super
?您的代码(和回溯)没有显示它。请注意,Python使用的是名称
,而不是变量
。像“变量(即指向函数的指针)”一样思考对于其他语言来说是很好的,但这会使您更难理解Python中发生了什么。在你的方法中,self
是指对象的name
(这里:“self”是由“baz”命名的同一事物的名称),而“foo”和bar
是类的名称。您需要属于对象而不是类的方法,因此像self.generator
和self.generator2
这样的方法会更有用。是的,虽然我只是想同意上面的解释,但最好还是把整个“指针”术语抛在脑后,虽然向来自不同语言的人解释python中的一些语义可能会有所帮助,但最好是理解python本身的术语,而python没有指针。函数是一级对象,与列表
或int
完全相同。将函数分配给变量就像将int
或list
分配给变量一样平凡variable@jalanbbar.generator
和self.generator
不一样。前者是类中以self
为第一个参数的方法,后者是实例方法。但是想想你的评论,我就知道是怎么回事了。很抱歉遗漏了细节。在试图让帖子通过时,编辑过程中丢失了一些东西。@juanpa.arrivillaga被攻占。很明显,python既不是我的第一种编程语言,也不是我的主要编程语言。您在哪里尝试过使用super
?您的代码(和回溯)没有显示它。请注意,Python使用的是名称
,而不是变量
。像“变量(即指向函数的指针)”一样思考对于其他语言来说是很好的,但这会使您更难理解Python中发生了什么。在你的方法中,self
是指对象的name
(这里:“self”是由“baz”命名的同一事物的名称),而“foo”和bar
是类的名称。您需要属于对象而不是类的方法,因此像self.generator
和self.generator2
这样的方法会更有用。是的,虽然我只是想同意上面的解释,但最好还是把整个“指针”术语抛在脑后,虽然向来自不同语言的人解释python中的一些语义可能会有所帮助,但最好是理解python本身的术语,而python没有指针。函数是一级对象,与列表
或int
完全相同。将函数分配给变量就像将int
或list
分配给变量一样平凡variable@jalanbbar.generator
和self.generator
不一样。前者是类中以self
为第一个参数的方法,后者是实例方法。但是想想你的评论,我就知道是怎么回事了。很抱歉遗漏了细节。在试图让帖子通过时,编辑过程中丢失了一些东西。@juanpa.arrivillaga被攻占。很明显,python既不是我的第一语言,也不是我的主要编程语言。