我无法理解为什么在以下示例中继承不起作用:
import vlc
class CustomMediaPlayer(vlc.MediaPlayer):
def __init__(self, *args):
super().__init__(*args)
def custom_method(self):
print("EUREKA")
custom_mp = CustomMediaPlayer()
print(custom_mp)
custom_mp.custom_method()
输出如下:
<vlc.MediaPlayer object at 0x7743d37db8f0>
AttributeError: 'MediaPlayer' object has no attribute 'custom_method'
而不是CustomMediaPlayer
对象,而是custom_method
。
为什么会发生这种情况?是因为vlc.MediaPlayer
是一个_Ctype
类吗?
如果基类重写
__new__
方法,则会发生这种情况,该方法控制着当有人尝试实例化该类时会发生什么。典型的行为是创建给定类参数的新实例;但该__new__
函数可以自由返回现有对象,或根据其自身的内部逻辑创建对象。在他们的评论中,Rogue链接到模块的源代码
__new__
,该模块确实会覆盖。如果有vlc.MediaPlayer
成功子类化的方法,则应在模块的文档中列出;否则解决此问题的方法将取决于您的特定要求。