【发布时间】:2012-02-13 18:22:35
【问题描述】:
我开始为我正在编写的游戏定义我的实体类。但是,我想要很多代码重用。我想为不同的功能定义类,然后让类“具有”其中一些类的功能。
例如:
class Collidable:
def handle_collision(other, incident_vector):
pass
def __init__(self, shape):
self.shape = shape
class Movable:
def update_position(self):
self.velocity += self.acceleration
self.position += self.velocity
def __init__(self, velocity, acceleration):
self.velocity, self.acceleration = velocity, acceleration
class Drawable:
def draw(self):
pass
def __init__(self, image):
self.image = image
class Controllable:
def key_down(self, key):
pass
def __init__(self):
pass
然后有一个 Player 类,它是 Collidable、Movable、Drawable、Controllable,一个 Invisible Barrier,它只是 Collidable,一个 Background,它只是 Drawable,等等。我听说过许多不同的连接方式多个类,(例如通过组合、(多个)继承、接口等),但我不知道哪种最适合这种情况和/或 Pythonic。
Mix-ins(多重继承的特殊情况)看起来是我正在寻找的(因为 Player 应该是 Collidable、Movable、Drawable 和 Controllable),但在尝试这个时,我'我发现使用 super 将正确的参数传递给正确的 init 函数有困难。
编辑:
我正在使用 python 3.2。
【问题讨论】:
-
请记住始终从“对象”继承您的类,无论多么短,以便“现代”对象行为适用于它们。有很多有用的恐惧只适用于新样式类,在 Python 2 中是从“对象”派生的类。作为替代方案,如果您有一个包含许多从无到有继承的短类的单个文件,只需设置一个模块级别
__metaclass__=type变量 - 这与从对象继承每个类具有相同的效果 -
这对 Python 3.x 仍然有效吗?我没有提到我正在使用 Python 3.2 进行开发,因为我不知道
super除了语法变化(从直接引用到对父级的间接引用)有任何问题。 -
@Darthfett:在 Py3k 中,类默认继承自
object。