首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python面向对象设计概念

Python面向对象设计概念
EN

Stack Overflow用户
提问于 2013-08-17 15:21:01
回答 3查看 3K关注 0票数 5

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

我现在看一些简单的项目来熟悉语言。其中一个挑战是让我开始关注面向对象的编程,而当我最后一次编写一个程序时,这个问题并不存在。

我的第一个项目是读取包含有关股票组合的信息的数据文件,对每个文件进行计算并打印一份报告。我已经开始工作了。

所以现在我看一些更高级的东西,读取并存储数据,然后使用这些数据为交互式问题提供答案。我的问题是如何存储数据以便于访问。

我的第一个想法是列一张清单(如,

代码语言:javascript
复制
companies = [ ['AMP', 1000, 2.50], ['ANZ', 2000, 17.00], ['BHP', 500, 54.30] ]

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

代码语言:javascript
复制
companyqty = companies[1][1]

或用于循环:

代码语言:javascript
复制
for company in companies:
    if company[0] == 'BHP':
        companyqty = company[1]

然后我想到了一本字典,它的价值是一个列表:

代码语言:javascript
复制
companies = {'AMP':[1000, 2.50], 'ANZ':[2000, 17.00], 'BHP':[500, 54.30] }
companyqty = companies['BHP'][0]

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

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

或者这类问题并不真正适合于面向对象的方法?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-17 15:25:58

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

代码语言:javascript
复制
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“等函数。

票数 4
EN

Stack Overflow用户

发布于 2013-08-17 15:24:25

下一步可以使用使用 factory生成的类。

代码语言:javascript
复制
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-derived对象是不可变的。如果不能将属性分配给属性,则需要创建一个新对象。

只有在需要向对象添加功能时,才需要切换到自定义类;添加对与对象关联的数据进行操作的方法:

代码语言:javascript
复制
class Company(object):
    def __init__(self, quantity, price):
        self.quantity = quantity
        self.price = price

    def profit(self, newprice):
        return self.quantity * (newprice - self.price)
票数 3
EN

Stack Overflow用户

发布于 2013-08-17 16:46:51

尽管如此,在Python中只有一种方法可以解决问题,这个问题的答案实际上取决于什么是“可以很容易地访问”。

这是否意味着程序员很容易访问对象及其属性?那么最好的方法是使Company成为类的一个实例,并提供价格、数量等方面的分布。也许,做一个称为Portfolio的类是过分的,除非您将非平凡的逻辑与列表或dict的逻辑分开。还可以基于字典创建类,因此可以通过键和属性进行访问。这就是我所说的容易访问的东西。看看webpy框架的存储类:https://github.com/webpy/webpy/blob/master/web/utils.py#L52作为一个例子。

如果“轻松访问”意味着第三方库将对数据进行序列化或其他处理,那么最简单的方法就是使用库所期望的数据结构。例如,JSON格式与Python的列表和字典映射得非常好(参见Roman的答案)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18290307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档