考虑下面的Python代码片段,其中定义了Portfolio
、Company
和Deposit
类。Portfolio
对象只是充当公司和存款的联合体。我们可以在投资组合上运行类似Profit
的度量。问题:
对于Company
或Deposit
类中包含的每个新度量,我需要在Portfolio
类中手动添加相应的函数;尽管它们的行为总是相同的:所有投资的总和。有没有办法改进类的逻辑/构造?如果我们需要添加100个其他指标。。。
Deposit
类只有一个Profit
函数,但没有Loss
(假设银行账户的利息是有保证的)。有没有一种方法可以将“未定义的”指标视为总是返回0?或者是否有更清晰/更正确的方法来定义这些指标?如果我们需要涵盖100种不同的投资类型,这些投资类型可能有或可能没有不同的衡量标准。。。
class Company():
def __init__(self, ItemsSold, ItemPrice, Expenses, Fines):
self.ItemsSold = ItemsSold
self.ItemPrice = ItemPrice
self.Expenses = Expenses
self.Fines = Fines
def Profit(self):
return self.ItemsSold * self.ItemPrice
def Loss(self):
return self.Expenses + self.Fines
def ProfitAndLoss(self):
return self.Profit() - self.Loss()
class Portfolio():
def __init__(self, Investments):
self.Investments = Investments
def Profit(self):
return sum([inv.Profit() for inv in self.Investments])
def Loss(self):
return sum([inv.Loss() for inv in self.Investments])
def ProfitAndLoss(self):
return sum([inv.ProfitAndLoss() for inv in self.Investments])
class Deposit():
def __init__(self, Notional, InterestRate, TimeHorizon):
self.Notional = Notional
self.InterestRate = InterestRate
self.TimeHorizon = TimeHorizon
def Profit(self):
return self.Notional * self.InterestRate * self.TimeHorizon
myComp1 = Company(100,2,50,20)
myComp2 = Company(200,2,100,80)
myDepos = Deposit(100,0.02,3)
myPortf = Portfolio([myComp1,myComp2,myDepos])
print(myPortf.Profit()) # Works fine
print(myPortf.ProfitAndLoss()) # Throws an error
第二个问题很简单:您所要做的就是创建一个
Base
类,其中每个度量都定义为一个返回0的方法。然后从Base
类派生所有Invest
类(Company
、Deposit
,等等),这样所有未定义的度量都将调用Base
类中相应的方法。你知道吗第一个问题有点难,因为它需要一些元编程。您的
Portfolio
类也可以从Base
类派生,然后它在Base
类(Base.__dict__
)的方法字典中查找以检索所有度量名称。之后,对于所有这些度量,它将创建一个特定的lambda方法,该方法为Investments
列表中的每个项目调用此度量,并对结果进行汇总。这是一个基本代码:产生以下输出:
如您所见,A.f1、B.f2、p.f1和p.f2并没有明确定义为方法,但由于继承和元编程,它们可以被调用
相关问题 更多 >
编程相关推荐