实例如何包含其他类的多个实例?

时间:2016-01-19 21:09:59

标签: python class oop inheritance

我正在创建一个基本游戏来帮助理解课程,Player()实例(Ben)拥有许多建筑物和单元。每个玩家,如本将拥有各种建筑物,如飞机工厂或Bot工厂。

class Player:

    def __init__(self):
        self.money = 200
        self.score = 0
        print('Created ')

    def increase_money(self, amount):
        self.money += amount

    def decrease_money(self, amount):
        self.money -= amount

    def check_money(self):
        print(self.money)


class Building(Player):

    def __init__(self):
        self.level = 0
        self.upgrade_cost = 100
        print('created building')

    def upgrade_building(self):
        self.level += 1

    def check_building_level(self):
        print(self.level)

ben = Player()

我已经意识到,如果我调用Building()类来创建一个实例,它实际上会创建一个继承了播放器属性的构建实例(即每个建筑物都有自己的钱)。

我如何让每个玩家包含不同属性的各种建筑物和单位?例如,本和比尔有不同的建筑物。在这种情况下,我会使用单个Player()类,然后使用Player()内的函数吗?

3 个答案:

答案 0 :(得分:5)

首先,从Building继承的Player没有多大意义,BuildingPlayer之间的是-a 关系似乎很奇怪,就像一个语义错误。

不要继承Player,即:

class Building(object):
     # code for the class

现在针对您的其他问题,如果您希望每个Player能够聚合Building个对象的多个实例,则可以使Player的每个实例都具有集合属性(a列表或集合)来存储Building个实例。

要实现此目的,您可以添加

self.buildings = []

__init__的{​​{1}}方法。最初,此列表将为空。要为特定播放器添加建筑物,请附加到其Player属性,例如:

buildings

玩家p = Player() p.buildings.append(Building()) p.buildings.append(Building()) p.buildings[1].upgrade_building() 现在有两座建筑物,第二座建筑物升级一次。这只是一个如何做到这一点的一般演示。如果没有关于您希望程序采用的方向的更多信息,我就无法多说些什么。

答案 1 :(得分:2)

您的播放器构造没有跟踪所拥有建筑物的属性。您的建筑物也没有所有者。所以你需要:

class Player:

    def __init__(self):
        self.money = 200
        self.score = 0
        self.buildings = []
        print('Created ')

    def increase_money(self, amount):
        self.money += amount

    def add_building(self, Building):
    #Here's what to call when we construct a new building with the owner
        self.buildings.append(Building):

    def decrease_money(self, amount):
        self.money -= amount

    def check_money(self):
        print(self.money)


class Building:
    def __init__(self, Owner, Type)
#Constructor now requires an Owner and Type:
        self.level = 0
        self.owner = Owner
        self.Type = Type
        self.upgrade_cost = 100
        print('created building')
        Owner.add_building(self) #And now we will add this to the owner's buildings set

    def upgrade_building(self):
        self.level += 1

    def check_building_level(self):
        print(self.level)

要创建建筑物,您可以这样称呼它:

P = player()
B1 = Building(P, "Building type")

这将添加到玩家的拥有建筑物列表中。此外,您可以查看每个建筑物的所有者(“建造了多少个Bot工厂?”)。您还可以查看玩家的建筑物。

答案 2 :(得分:0)

所以这个答案更多是为了参考目的 - 有人可能会尝试做同样的事情。

我实际上找到了最好的方法,最干净的是从Player类调用Building类:

class Player:

    def __init__(self):
        self.money = 200
        self.score = 0
        print('Created ')
        self.bot_factory = Building('Bot Factory') # [1]
        self.vehicle_factory = Building('Vehicle Factory')

    def increase_money(self, amount):
        self.money += amount

    def decrease_money(self, amount):
        self.money -= amount

    def check_money(self):
        print(self.money)


class Building(Player):

    def __init__(self):
        self.level = 0
        self.upgrade_cost = 100
        print('created building')

    def upgrade_building(self):
        self.level += 1

    def check_building_level(self):
        print(self.level)

ben = Player()

这样,每个玩家,比如Ben都有自己的版本bot_factory和vehicle_factory。然后,我打算通过ben.building_upgrade('bot','upgrade')之类的调用来升级建筑物,该调用从Player类调用Building函数。