如何向从公共类派生的一组子类添加相同的方法/属性

2024-06-28 18:51:00 发布

您现在位置:Python中文网/ 问答频道 /正文

向从同一个类派生的子类中添加一组公共方法/属性的正确方法是什么?在

让我们假设这些是我的类,我需要一个基于动物的视频游戏(这只是一个例子,我不是真的在写游戏,但想法是一样的)

class Animal():
    def __init(self, numlegs):
        self.numlegs = numlegs

class Dog(Animal):
    def __init(self, numlegs):
        Animal.__init__(self, numlegs)

    def bark(self):
        print "Arf!"

class Cat(Animal):
    def __init(self, numlegs):
        Animal.__init__(self, numlegs)

    def playwithmouse(self):
        print "It's fun!"

class Duck(Animal):
    def __init(self, numlegs):
        Animal.__init__(self, numlegs)

    def fly(self):
        print "Weee!"

在游戏中,狗和鸭子可以被武器化,它们需要有相同的方法:fire()、reload()和properties:ammoncount。在

我认为在Animal()类中添加它们是不正确的,因为它们将在游戏的另一个完全不同的部分中被需要。在

添加它们的正确方法是什么?在

更新 我想补充一下,预期的结果是 动物武器混合类

^{pr2}$

我从答案中得到的是,如果我需要全套“武器/弹药”,我可以使用多类,否则合成是一种方法。在


Tags: 方法self游戏视频属性initdef子类
3条回答

您可以利用python中的多个继承,如:

class Weapon():
    def __init__(self):
        self.ammoCount = 0
    def fire():
        print "fire!"
    def reload():
        print "reloading!"

class Dog(Animal, Weapon):
    def __init(self, numlegs):
        Animal.__init__(numlegs)

    def bark(self):
        print "Arf!"

现在您可以执行以下操作:

^{pr2}$

如果^{cd1>}仅应为bean^{cd2>},而不是^{cd2>}-^{cd4>}混合型,则使用^{cd4>}的实例,并将其分配给狗作为组件:

^{pr3}$

那么您必须使用^{cd6>}。这可能不符合您的概念^{cd1>,实际上是一种武器,但现在它已经武器化了。:)

如果您有一个dog实例,并且需要它随时进行武器化,那么就利用python的动态属性分配

^{pr4}$

一般来说我会说:

  • 如果您想^{cd1>}或^{cd9>}成为be武器,请使用继承。
  • 如果要^{cd1>}或^{cd9>}到组或的eem>具有一个(或多个)武器/s,请使用组件。

用构图来做这个

class Weapon(object):
    def __init__(self, type):
        self.type = type

class Dog(Animal):
    def __init(self, numlegs):
        Animal.__init__(numlegs)
        self.gun = Weapon("gun")

    def bark(self):
        print "Arf!"

一种可能:根本不要把它们添加到类中。创建一个“武器”类,其中包含有关武器如何工作的所有信息,并将该类的实例添加到可以成为武器的对象中。在

当然,这意味着需要重新考虑一下您的架构,但这是一个很好的概念。这种想法通常被称为“基于组件的”。Google for "component-based game objects"并尝试找到一些描述这个想法的博客文章/演示。在

相关问题 更多 >