【发布时间】:2011-08-16 12:23:29
【问题描述】:
我有一个基类的实例,然后我想让它成为这个基类的子类的实例。也许我以错误的方式处理问题,并且在 OOP 中有一些我不理解的重要内容。代码只是用来说明的,可以建议一种非常不同的方法。任何帮助表示赞赏。
class Car(object):
def __init__(self, color):
self.color = color
def drive(self):
print "Driving at 50 mph"
class FastCar(Car):
def __init__(self, color, max_speed=100):
Car.__init__(self, color)
self.max_speed = max_speed
def drive_fast(self):
print "Driving at %s mph" %self.max_speed
one_car = Car('blue')
# After the instanciation, I discovered that one_car is not just a classic car
# but also a fast one which can drive at 120 mph.
# So I want to make one_car a FastCar instance.
我看到了一个非常相似的问题,但没有一个答案适合我的问题:
我不想让 FastCar 成为知道如何快速驾驶的 Car 的包装器:我真的希望 FastCar 扩展 Car ;
我真的不想在 FastCar 中使用
__new__方法对参数进行一些测试并决定__new__是否必须返回 Car 的新实例或我给它的实例 (例如:def __new__(cls, color, max_speed=100, baseclassinstance=None))。
【问题讨论】:
-
你为什么不这样做:one_car = FastCar(one_car.color, 120) ?这不是真正的继承或其他任何东西,但应该可以工作。
-
您的 OOP 设计似乎有点不对劲。我想 FastCar 也会实现 drive(),但会以更高的速度(你已经实现为 drive_fast)。有了你现在所拥有的,调用者必须知道类型才能知道调用哪个方法(坏),而不是调用相同的方法并让各种类型适当地实现该方法(好)。您也可以通过在 FastCar 类的末尾添加
drive = drive_fast来做到这一点。 -
好的。一个更好的例子:
FastCar没有drive_fast方法,而是overtake方法,而Car不存在这种方法。 -
@Eugene @agf @Peter 好吧,我的例子太简单了。整件事是我不想创建一个新对象,也不想有两个不同的实例。如果有帮助,假设
Car来自外部模块,color实际上是__color,Car的私有成员。或者Car.__init__不仅将color分配给self.color,而且对颜色进行了大量计算(实际上是一个很大的numpy.array),并且我无法重复这些计算来创建FastCar。 -
由于 Python 中没有真正的私有成员,您可以只使用我的任一方法的版本——只需将计算的属性复制到新实例(方法 1)或仅更改当你摆弄它的属性(我的方法2)时,类和任何必要的方法——这一切都假设你仍然不想有条件
__new__或__init__s。不过,如果您认为需要这样做,可能需要重新设计继承/类结构。
标签: python oop inheritance