在__init__中设置对象的父类?
在创建一个对象的时候,能不能传入一个类,让这个对象从那个类派生呢?
比如说:
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())
编辑:修正了示例代码中构造函数参数的名称