Python 使用已初始化的父对象创建子类对象

Python 使用已初始化的父对象创建子类对象,python,inheritance,Python,Inheritance,我有一个BaseEntity类,它定义了一堆(很多)非必需的属性,并具有大部分功能。我在另外两个类中扩展了这个类,它们有一些额外的方法,并且初始化了一个必需的属性 class BaseEntity(object): def __init__(self, request_url): self.clearAllFilters() super(BaseEntity, self).__init__(request_url=request_url) @p

我有一个BaseEntity类,它定义了一堆(很多)非必需的属性,并具有大部分功能。我在另外两个类中扩展了这个类,它们有一些额外的方法,并且初始化了一个必需的属性

class BaseEntity(object):

    def __init__(self, request_url):
        self.clearAllFilters()
        super(BaseEntity, self).__init__(request_url=request_url)

    @property
    def filter1(self):
        return self.filter1

    @filter1.setter
    def filter1(self, some_value):
        self.filter1 = some_value
    ...
    def clearAllFilters(self):
        self.filter1 = None
        self.filter2 = None
        ...

    def someCommonAction1(self):
        ...

class DefinedEntity1(BaseEntity):

    def __init__(self):
        super(BaseEntity, self).__init__(request_url="someUrl1")

    def foo():
        ...

class DefinedEntity2(BaseEntity):

    def __init__(self):
         super(ConsensusSequenceApi, self).__init__(request_url="someUrl2")

    def bar(self):
        ...
我想要的是初始化一次BaseEntity对象,指定所有过滤器,然后使用它创建每个definedEntity,即

baseObject = BaseEntity(None)
baseObject.filter1 = "boo"
baseObject.filter2 = "moo"

entity1 = baseObject.create(DefinedEntity1)
寻找pythonic的想法,因为我刚刚从静态类型语言转换过来,仍在努力掌握python的强大功能。

一种方法:

import copy

class A(object):
    def __init__(self, sth, blah):
        self.sth = sth
        self.blah = blah

    def do_sth(self):
        print(self.sth, self.blah)

class B(A):
    def __init__(self, param):
        self.param = param

    def do_sth(self):
        print(self.param, self.sth, self.blah)

a = A("one", "two")
almost_b = copy.deepcopy(a)
almost_b.__class__ = B
B.__init__(almost_b, "three")
almost_b.do_sth() # it would print "three one two"

请记住,Python是一种非常开放的语言,有很多动态修改的可能性,最好不要滥用它们。从干净代码的角度来看,我只需要简单地调用superconstructor。

感谢您的解决方案,Radoslaw。不过,这确实感觉像是一次黑客攻击。。。你能详细解释一下“对超级建设者的普通呼吁”吗?但是请记住,我希望避免每次创建子类对象时都需要提供所有属性的情况。为什么不在类B的构造函数上设置一个可选参数,该参数接受类a并将类B属性设置为类a值呢,Python没有超自然的能力让它知道在子类实体中要使用哪些字段添加到基类中(顺便说一句,如果它不做任何额外的事情,就不需要实现属性getter和setter,就像您的示例一样)。您可以创建一个子类构造函数,该构造函数接受超类实例,检查其字段字典(使用vars-see),然后决定将其中一些字段(基于值类型、属性名称或解析注释)添加到自身中。它被称为从原型创建对象。Python不支持原型范例。它可以通过巧妙地使用强大的内省功能来模仿,但总感觉有点不对劲。正如Steve Cohen提到的——在99%的情况下,最好使用常规方法(创建一个从超类实例获取属性值的子类构造函数)。我以前曾想过将超类对象传递给子类构造函数,但感觉很奇怪,因为超类就在那里。。。。但仔细阅读你们的评论,再多想想,我也看不出有什么更好的办法。谢谢你们的真知灼见,伙计们。它们将帮助我使我的代码更具Python风格。