在__init__中设置对象的父类?

5 投票
5 回答
1495 浏览
提问于 2025-04-15 16:47

在创建一个对象的时候,能不能传入一个类,让这个对象从那个类派生呢?

比如说:

class Red(object):
    def x(self):
        print '#F00'

class Blue(object):
    def x(self):
        print '#00F'

class Circle(object):
    def __init__(self, parent):
        # here, we set Bar's parent to `parent`
        self.x()

class Square(object):
    def __init__(self, parent):
        # here, we set Bar's parent to `parent`
        self.x()
        self.sides = 4

red_circle = Circle(parent=Red)
blue_circle = Circle(parent=Blue)
blue_square = Square(parent=Blue)

这样做的效果和下面这个差不多:

class Circle(Red):
    def __init__(self):
        self.x()

不过,这样做不会影响到其他的Circle实例。

5 个回答

1

听起来你想用继承来做一些它本来不适合的事情。如果你能解释一下你为什么想这么做,也许我们能找到一种更合适、更可靠的方法来实现你的目标。

7

也许你想要的是一个类工厂:

#!/usr/bin/env python
class Foo(object):
    def x(self):
        print('y')

def Bar(parent=Foo):
    class Adoptee(parent):
        def __init__(self):
            self.x()
    return Adoptee()
obj=Bar(parent=Foo)
4

我同意@AntsAasma的看法。你可能应该考虑使用依赖注入。至少在给出的这个例子中(我相信这个例子是为了说明你的问题而大大简化的),形状的颜色更适合用拥有关系来表示,而不是用是一个关系

你可以通过将想要的颜色对象传递给构造函数,保存对它的引用,然后把功能调用委托给这个对象来实现。这大大简化了实现过程,同时仍然保留了所需的行为。这里有个例子:

class Red(object):
    def x(self):
        print '#F00'

class Blue(object):
    def x(self):
        print '#00F'

class Shape(object):
    def __init__(self,color):
        self._color=color
    def x(self):
        return self._color.x()

class Circle(Shape):
    def __init__(self, color):
        Shape.__init__(self,color)
        self.x()

class Square(Shape):
    def __init__(self, color):
        Shape.__init__(self,color)
        self.x()
        self.sides = 4

red_circle = Circle(color=Red())
blue_circle = Circle(color=Blue())
blue_square = Square(color=Blue())

编辑:修正了示例代码中构造函数参数的名称

撰写回答