我只是在经历了20年的差距后回到编程。我认为Python看起来相当简单和强大,所以我做了一个在线课程和一些阅读。
我现在正在研究一些简单的项目来熟悉这门语言。其中一个挑战是围绕面向对象的编程,这在我上次编写程序时并不存在。
我的第一个项目是读取包含有关股票投资组合信息的数据文件,对每个投资组合进行一些计算并打印报告。我有这个工作。
所以现在我正在寻找更先进的东西,读取数据并存储它,然后使用数据来提供交互式问题的答案。我的问题是如何存储数据,以便轻松访问。
我的第一个想法是制作一份清单,例如
companies = [ ['AMP', 1000, 2.50], ['ANZ', 2000, 17.00], ['BHP', 500, 54.30] ]
这可以在循环中轻松访问,但访问方法并不完全友好 - 数字作为索引而不是名称:
companyqty = companies[1][1]
或for for循环:
for company in companies:
if company[0] == 'BHP':
companyqty = company[1]
然后我想到了一本字典,其值为列表:
companies = {'AMP':[1000, 2.50], 'ANZ':[2000, 17.00], 'BHP':[500, 54.30] }
companyqty = companies['BHP'][0]
这提供了对任何给定公司的即时访问,但仍然坚持使用数字索引。
所以我想知道如何以面向对象的方式构建它,以便能够保存公司列表和所有相关数据,并能够方便地访问这些值。到目前为止,我的所有想法看起来都像上面的列表或词典。
或者这种问题不适合面向对象的方法吗?
谢谢
答案 0 :(得分: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
您可以按属性名称访问馆藏的属性。您可以将它带到下一个级别,并为组合编写一个类,它可能具有“holdingList”和“broker name”等属性,以及“getTotalValue”之类的函数,等等。
答案 1 :(得分:3)
您的下一步可能是使用使用collections.namedtuple()
factory生成的类:
from collections import namedtuple
Company = namedtuple('Company', 'quantity price')
companies = {'AMP': Company(1000, 2.50), 'ANZ': Company(2000, 17.00), 'BHP': Company(500, 54.30)}
companies['AMP'].quantity
请注意,与tuple
个对象一样,namedtuple
- 派生对象是不可变的。您无法分配属性,而是创建一个新对象。
如果需要向对象添加功能,则只需切换到自定义类;添加作用于与对象关联的数据的方法:
class Company(object):
def __init__(self, quantity, price):
self.quantity = quantity
self.price = price
def profit(self, newprice):
return self.quantity * (newprice - self.price)
答案 2 :(得分:1)
你也可以使用嵌套词典:
companies =
{
'AMP': {'quantity':1000, 'price': 2.50},
'ANZ': {'quantity':2000, 'price': 17.00},
'BHP': {'quantity':500, 'price': 54.30}
}
并访问它:
companyqty = companies['BHP']['quantity']
你甚至可以为公司定义额外的“属性”:
companies =
{
'AMP': {'quantity':1000, 'price': 2.50, 'foundation_date': '2013-01-01'},
'ANZ': {'quantity':2000, 'price': 17.00},
'BHP': {'quantity':500, 'price': 54.30, 'head': 'Jeffrey'}
}
答案 3 :(得分:0)
即便如此,在Python中只有一种方法可以做到,这个问题的答案实际上取决于“可以轻松访问”的内容。
这是否意味着,程序员很容易访问对象及其属性?那么最好的方法是让公司成为一个类的实例,并提供价格,数量等的属性。可能,将类称为Portfolio是不合适的,除非你将具有除列表或词典之外的非平凡逻辑。也可以基于字典来创建类,因此可以通过键和属性进行访问。这就是我所说的轻松访问的内容。看一下webpy框架的Storage类:https://github.com/webpy/webpy/blob/master/web/utils.py#L52作为示例。
如果“轻松访问”意味着第三方库将对数据进行一些序列化或其他处理,那么最简单的方法是使用库所期望的数据结构。 例如,JSON格式可以很好地映射Python的列表和字典(请参阅Roman Pekar的答案)。