【发布时间】:2014-03-13 22:49:37
【问题描述】:
这是我想要实现的目标:
- 通过将数据传递给超类
SKBusPacket来创建数据包对象。 - 数据包的子类型在
__init__()中确定,并根据该数据包的子类型(“请求”或“响应”子类型)引发异常。 - 这个异常被捕获,数据被传递给子类
SKBusRequestPacket或SKBusResponsePacket。
问题:创建子类的实例会一次又一次地引发上述异常,因为我通过super 将初始化参数传递给超类(参见代码)。
建议的解决方案:通过检查实例是否是子类之一来避免使用raise,使用isinstance()。但我的印象是这是不好的做法,而且不符合 Python 风格。
我的简化代码:
class SKBusPacket(Packet):
def __init__(self, *args, **kwargs):
super(SKBusPacket, self).__init__(*args, **kwargs)
self.packet_type = self.getSkbPacketType()
if self.packet_type == 'request':
raise ActuallySKBusReqPacket
elif self.packet_type == 'response':
raise ActuallySKBusPRPacket
# Here go some attributes and methods common to all packets...
# Both Request and Response packets inherit from base-class "SKBusPacket"
class SKBusRequestPacket
def __init__(self, *args, **kwargs):
# Pass init arguments to super-class "SKBusPacket".
super(SKBusRequestPacket, self).__init__(*args, **kwargs)
class SKBusResponsePacket
def __init__(self, *args, **kwargs):
# Pass init arguments to super-class "SKBusPacket".
super(SKBusResponsePacket, self).__init__(*args, **kwargs)
def log_skbus(raw_pkt):
try:
pkt = SKBusPacket(raw_pkt.data)
except ActuallyRequestPacket:
pkt = SKBusRequestPacket(raw_pkt.data)
except ActuallyResponsePacket:
pkt = SKBusResponsePacket(raw_pkt.data)
【问题讨论】:
-
这种方法看起来很奇怪。为什么不能创建一个只构造所需类型对象的工厂函数?
-
@WGH 我不反对。我想遵循最好的设计原则,所以我会去阅读什么是工厂功能。谢谢你的建议。
标签: python oop inheritance