Python面向对象设计概念

2024-10-01 07:18:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在20年的差距之后,我又回到了编程上。我认为Python看起来相当简单和强大,所以我做了一个在线课程和一些阅读。在

我现在看一些简单的项目来熟悉这门语言。其中一个挑战是让我的头脑转向面向对象编程,这在我上一次编写程序时并不存在。在

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

所以现在我要看一些更高级的东西,读入数据并存储,然后使用这些数据来回答交互式问题。我的问题是如何存储数据以便可以轻松访问。在

我的第一个想法是列一张单子,例如

companies = [ ['AMP', 1000, 2.50], ['ANZ', 2000, 17.00], ['BHP', 500, 54.30] ]

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

^{pr2}$

或用于循环:

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]

这提供了对任何给定公司的即时访问,但仍然停留在数字索引上。在

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

或者这类问题真的不适合面向对象的方法吗?在

谢谢


Tags: 数据项目方法列表字典公司数字面向对象
3条回答

对于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

您可以通过属性名访问所持资产的属性。您可以将其提升到下一个级别,并为portfolio编写一个类,该类可以具有“holdingList”和“broker name”等属性,以及“getTotalValue”等函数。在

下一步可以是使用由^{} 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派生的对象是不可变的。你不能给属性赋值,你应该创建一个新的对象。在

如果需要向对象添加功能,则只需切换到自定义类;添加对与对象关联的数据执行操作的方法:

^{pr2}$

您还可以使用嵌套词典:

companies =
   {
      'AMP': {'quantity':1000, 'price': 2.50},
      'ANZ': {'quantity':2000, 'price': 17.00},
      'BHP': {'quantity':500, 'price': 54.30}
   }

访问方式如下:

^{pr2}$

您甚至可以为公司定义额外的“属性”:

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'}
   }

相关问题 更多 >