Python中super()结合Enum参数失效的技术问题咨询
问题根源:方法名拼写错误
你遇到的问题其实是个非常容易犯的小笔误——LogEvent类里的初始化方法名字写错了!
你写的是:
def __int__(self):
但正确的实例初始化方法应该是__init__(两个下划线+init+两个下划线),而__int__是Python用来实现对象转int类型的特殊方法,根本不会在实例化对象时自动调用。
详细拆解
当你创建LogEvent()实例时,Python会自动寻找类中的__init__方法完成初始化。但你的LogEvent类里没有正确定义这个方法,所以它会直接继承父类Event的__init__,而父类默认把type_设为None,这就是为什么打印结果是None。
反观TimerEvent类,它的__init__方法拼写完全正确,所以能正常调用父类的初始化逻辑,传入EventType.TIMER_EVENT,自然能得到正确结果。
修正后的代码
把LogEvent里的__int__改成__init__就能解决问题:
from enum import Enum EventType = Enum('EventType', ('TIMER_EVENT', 'LOG_EVENT')) class Event(object): def __init__(self, type_=None): self.type_ = type_ class LogEvent(Event): def __init__(self): # 修正方法名 super(LogEvent, self).__init__(EventType.LOG_EVENT) class TimerEvent(Event): def __init__(self): super(TimerEvent, self).__init__(EventType.TIMER_EVENT) print(LogEvent().type_) # 现在会输出EventType.LOG_EVENT print(TimerEvent().type_) # 输出EventType.TIMER_EVENT
小提醒
Python里这类双下划线包裹的特殊方法(比如__str__、__repr__)名字一定要记准,拼写错误会导致方法无法被Python自动触发,出现各种看似“莫名其妙”的问题。
内容的提问来源于stack exchange,提问作者Asfy
相关产品推荐
相关产品推荐

