我想将一个对象添加到另一个文件的列表中

时间:2013-12-23 22:30:29

标签: python list object polymorphism

我有3个文件。第一个是抽象的Runners文件。另外两个是CharityRunner和ProfessionalRunners。在这些我可以创建跑步者。

参赛者:

class Runner(object):
def __init__ (self, runnerid, name):
    self._runnerid = runnerid
    self._name = name

@property
def runnerid(self):
    return self._runnerid

@property
def name(self):
    return self._name

@name.setter
def name(self, name):
    self._name = name

def get_fee(self, basicfee, moneyraised):
    raise NotImplementedError("AbstractMethod")        

CharityRunners:

from Runner import *

class CharityRunner(Runner):
def __init__ (self, runnerid, name, charityname):
    super().__init__(runnerid, name)
    self._charityname = charityname

@property
def charityname(self):
    return self._charityname

@charityname.setter
def charityname(self, charityname):
    self._charityname = charityname

def get_fee(self, basicfee, moneyraised):
    if moneyraised >= 100:
        basicfee = basicfee * 0.25
    elif moneyraised >= 50 and moneyraised < 100:
        basicfee = basicfee * 0.5
    else:
        basicfee = basicfee
    return basicfee

ProfessionalRunners:

from Runner import *

class ProfessionalRunner(Runner):
def __init__ (self, runnerid, name, sponsor):
    super().__init__(runnerid, name)
    self._sponsor = sponsor

@property
def sponsor(self):
    return self._sponsor

@sponsor.setter
def sponsor(self, sponsor):
    self._sponsor = sponsor

def get_fee(self, basicfee):
    basicfee = basicfee * 2
    return basicfee

现在我还创建了一个俱乐部对象,其中包含俱乐部ID和俱乐部名称。还有一个名为self._runners = []的列表。我正在尝试添加一个添加函数,它将添加列表中创建的运行器。但它必须确保跑步者不在列表中。

对象打印方法的格式应为:

Club: <club id> <club name>

Runner: <runner id 1> <runner name 1>

Runner: <runner id 2> <runner name 2>

目前我只为俱乐部对象提供此功能:

from Runner import *

class Club (object):
def __init__(self, clubid, name):
    self._clubid = clubid
    self._name = name
    self._runners = []

@property
def clubid(self):
    return self._clubid

@property
def name(self):
    return self._name

@name.setter
def name(self, name):
    self._name = name

def add_runner(self):
    self._runner.append(Runner)

1 个答案:

答案 0 :(得分:3)

我猜你错过的部分是:

  

我试图获得一个添加功能,它将添加列表中创建的跑步者。

您现有的代码执行此操作:

def add_runner(self):
    self._runner.append(Runner)

这有很多问题。

首先,您尝试修改不存在的self._runner,而不是self._runners

接下来,当你几乎肯定想要一个实例而不是类本身时,你会附加Runner

事实上,你几乎肯定想要一个子类的实例。

我愿意打赌你想要一个特定的实例,有人会传递给add_runner函数,而不仅仅是一些随机实例。

所以,你想要的可能是:

def add_runner(self, runner):
    self._runners.append(runner)

现在你发布了UML图,它明确地说:add_runner(Runner: runner)。在Python中,您将其写为:

def add_runner(self, runner):

或者,如果你真的想要:

def add_runner(self, runner: Runner):

...但这可能会误导您认为这是一个Java风格的定义,需要Runner的实例或其某些子类并静态检查它,并且可以使用不同的参数类型重载,等等,都不是真的。


要使用它,请执行以下操作:

doe_club = Club(42, "Doe Family Club")
john_doe = CharityRunner(23, "John Doe", "Toys for John Doe")
doe_club.add_runner(john_doe)

下一步:

  

但它必须确保跑步者不在列表中。

你几乎可以直接从英语翻译成Python:

def add_runner(self, runner):
    if runner not in self._runners:
        self._runners.append(runner)

但是,这会对列表中的每个新跑步者进行线性搜索。如果您使用了适当的数据结构,例如set,则这不是问题。您可以使用相同的代码(但使用add代替append)...但您甚至不需要使用set进行检查,因为它已经为你完成了重复。因此,如果您设置self._runners = {},则只需:

def add_runner(self, runner):
    self._runners.add(runner)