我有以下示例代码:
class A(object): def __init__(self, id): self.myid = id def foo(self, x): print 'foo', self.myid*x class B(A): def __init__(self, id): self.myid = id self.mybid = id*2 def bar(self, x): print 'bar', self.myid, self.mybid, x
使用时,可以生成以下内容:
>>> a = A(2) >>> a.foo(10) foo 20 >>> >>> b = B(3) >>> b.foo(10) foo 30 >>> b.bar(12) bar 3 6 12
现在让我说我有更多的子类class C(A):
和class D(A):
.我也知道id总是适合B,C或D,但同时也不会在2中.
现在我想调用A(23)并获得正确子类的对象.像这样的东西:
>>> type(A(2))>>> type(A(22)) >>> type(A(31)) >>> type(A(12))
这是不可能的,还是可能,但只是糟糕的设计?如何解决这样的问题?
您应该实现 抽象工厂模式,然后您的工厂将构建您喜欢的任何对象,具体取决于提供的参数.这样你的代码将保持清洁和可扩展.
升级解释器版本时,可以删除任何可以直接使用它的hack,因为没有人期望向后兼容性来保留这些东西.
编辑:过了一段时间我不确定你是否应该使用抽象工厂或工厂方法模式.这取决于您的代码的详细信息,因此适合您的需求.