类设计-从基类初始化返回子类

时间:2018-12-12 04:47:01

标签: python

我有两个类,它们的方法相似(readwriteinsert),但是由于农产品的文件类型不同,它们的方法必须以不同的方式实现。理想情况下,我希望用户初始化基本类型,并在实例化期间根据关键字返回适当的子类型:

c = SomeThing() # returns subclass of type 1 (set in default)
c = Something(flag=True) # returns the other subclass

最初,我尝试将return语句放入基类的__init__中,但是显然__init__应该返回None,因此不确定在哪里设置;我应该只创建返回适当类型的基类工厂方法吗?:

class SomeThing:
    def __init__(self, flag=False):
        self.build(flag)
    def build(self, flag):
        if not flag:
            return SubclassOne()
        reutnr SubclassTwo()

或者是否有更好的方法可以根据实例化时传递的关键字动态绑定适当的方法?我不认为这会是理想的:

class SomeThing:
    def __init__(self, flag=False):
        if not flag:
            setattr(self, 'write', self.write_one)
        else:
            setattr(self, 'write', self.write_two)
    def write_one(self):
        # stuff
    def write_two(self):
        # stuff

因为界面的用户可以简单地访问其他方法,并且我不想在类之外定义每个方法,因为那样的话,用户可以说做from something import write_one,这是不适当的行为。

1 个答案:

答案 0 :(得分:2)

我建议您选择一家工厂:

class Base(object):
    # ...

class SomeThing(Base):
    # ...

class OtherThing(Base):
    # ...

def create_thing(flag = False):
    if flag:
        return SomeThing()
    else:
        return OtherThing()