我有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)
答案 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)