Python面向对象的设计概念

Dav*_*d M 5 python object-oriented-analysis

隔了20年之后,我才回到编程领域。我认为Python看上去相当简单和强大,因此我完成了在线课程和阅读。

我现在正在看一些简单的项目来熟悉这种语言。挑战之一是使我的注意力转向面向对象的编程,而上次编写程序时并没有。

我的第一个项目是读取一个数据文件,其中包含有关股票投资组合的信息,对每个投资组合进行一些计算,然后打印报告。我有这个工作。

因此,现在我正在研究更高级的内容,读取并存储数据,然后使用数据提供交互式问题的答案。我的问题是如何存储数据以便可以轻松访问。

我首先想到的是列出清单,例如

companies = [ ['AMP', 1000, 2.50], ['ANZ', 2000, 17.00], ['BHP', 500, 54.30] ]
Run Code Online (Sandbox Code Playgroud)

可以很容易地在循环中进行访问,但是访问方法并不完全友好-数字作为索引而不是名称:

companyqty = companies[1][1]
Run Code Online (Sandbox Code Playgroud)

或循环:

for company in companies:
    if company[0] == 'BHP':
        companyqty = company[1]
Run Code Online (Sandbox Code Playgroud)

然后我想到了一个字典,其值是一个列表:

companies = {'AMP':[1000, 2.50], 'ANZ':[2000, 17.00], 'BHP':[500, 54.30] }
companyqty = companies['BHP'][0]
Run Code Online (Sandbox Code Playgroud)

这样可以立即访问任何给定的公司,但是仍然停留在数字索引上。

因此,我想知道如何以一种面向对象的方式来构造它,以便能够保存公司列表和所有相关数据,并能够方便地访问这些值。到目前为止,我所有的想法都像上面的清单或字典一样。

还是这种问题真的不适合面向对象的方法?

谢谢

Bri*_*ius 4

对于 OOP 方法来说,这是一个很好的问题。例如,您可以为特定投资组合股票创建一个类,该类具有公司名称、股票数量和股价等属性。您可以为其提供有用的功能,例如getValue. 这是一个示例实现:

class Holding:
    def __init__(self, companyName, numShares, sharePrice):
        self.companyName = companyName
        self.numShares = numShares
        self.sharePrice = sharePrice
    def getValue(self):
        return self.numShares * self.sharePrice

portfolio = {'AMP':Holding('AMP', 1000, 2.5), 'ANZ':Holding('ANZ', 2000, 17.0), 'BHP':Holding('BHP', 500, 54.30)}

print portfolio['BHP'].sharePrice
# 54.3
print portfolio['AMP'].getValue()
# 2500.0
Run Code Online (Sandbox Code Playgroud)

您可以通过属性名称访问您的馆藏属性。您可以将其提升到一个新的水平,并为投资组合编写一个类,该类可以具有“holdingList”和“经纪人名称”等属性,以及“getTotalValue”等函数。