当前位置:  开发笔记 > 编程语言 > 正文

我可以从超类中实例化一个子类对象

如何解决《我可以从超类中实例化一个子类对象》经验,为你挑选了1个好方法。

我有以下示例代码:

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))

这是不可能的,还是可能,但只是糟糕的设计?如何解决这样的问题?



1> Abgan..:

您应该实现 抽象工厂模式,然后您的工厂将构建您喜欢的任何对象,具体取决于提供的参数.这样你的代码将保持清洁和可扩展.

升级解释器版本时,可以删除任何可以直接使用它的hack,因为没有人期望向后兼容性来保留这些东西.

编辑:过了一段时间我不确定你是否应该使用抽象工厂或工厂方法模式.这取决于您的代码的详细信息,因此适合您的需求.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有