嵌套布局的Python类层次结构 - 这有意义吗?
我遇到了一些奇怪的错误,心里在想我是不是在类的层次结构上有根本性的问题。说实话,我对Python完全是个新手。所以如果我的这个做法看起来完全不靠谱,你们也知道为什么了 :-)
我在一个应用程序中设计了几个类,采用的是MVC模式。这个应用的控制器管理着四个我称之为“设备”的对象,因为它们像独立的设备一样运作。每个设备执行一些操作(计算),在这个例子中是图像处理。这些操作应该在不同的线程中运行。所以每个设备都应该开启一个“自己的”线程,并在那个线程中完成计算。
为此,我设计了一个描述“设备”的基类,这样所有设备都可以继承它的基本设置和逻辑,特别是它们如何被控制器控制。关于线程,我实现了一个“工作者”类,打算把这个类的实例放入线程中。这个部分现在还没有工作。那些工作者类是这样设计的:基设备类里面包含一个嵌套的工作者基类。它还实现了一些基本的控制方法,用来处理作为基设备类成员存储的工作者实例。所有专门的设备类(从基设备类派生)也实现了一个嵌套的工作者类。这些类是从基设备类里面的基工作者类派生的。下面是层次结构的草图:
/class Device/
/methods
/members
/class Worker/
/methods
/members
/class fooDevice(Device)/
/methods
/members
/class fooWorker(Device.Worker)/
/methods
/members
/class barDevice(Device)/
/methods
/members
/class barWorker(Device.Worker)/
/methods
/members
注意,fooWorker
和barWorker
这两个类都是从Device.Worker
派生的!
我的问题是:虽然在设置过程中一切看起来都正常,但我在运行时却遇到了错误。我还不确定这些错误是从哪里来的,意味着什么。不过首先我想搞清楚我设计的这个类层次结构是否合理?它是不是完全扭曲的 nonsense?还是说在实际中是常见的?
谢谢!
1 个回答
嵌套类是有其用处的。Django在模型和表单的Meta配置中就使用了嵌套类。我有时候在工厂模式中也会用到它们,比如:
class BaseFactory(object):
class FactoryItem(object):
pass
@classmethod
def create(cls):
return cls.FactoryItem()
class ShoeFactory(BaseFactory):
class FactoryItem(BaseFactory.FactoryItem):
def laces(self):
return 1
不过,你也可以很简单地把FactoryItem类定义在全局,然后把它们分配给“FactoryItem”这个类的成员,比如:
class Shoe(BaseFactory.FactoryItem):
...
class ShoeFactory(BaseFactory):
FactoryItem = Shoe
我遇到的唯一问题是对象的反序列化。我记不太清楚具体是什么时候/在哪里/为什么,可能是某个地方在使用pickle,但它没能解析嵌套类。
你遇到了什么具体的运行时问题呢?