5

20年ぶりにプログラミングを再開しました。Python はかなり単純で強力に見えると思ったので、オンライン コースを受講し、いくつかの資料を読みました。

私は今、言語に慣れるためにいくつかの簡単なプロジェクトを見ています。課題の 1 つは、オブジェクト指向プログラミングに頭を悩ませることです。これは、私が前回プログラムを作成したときには存在していませんでした。

私の最初のプロジェクトは、株式ポートフォリオに関する情報を含むデータ ファイルを読み込み、それぞれについて計算を行い、レポートを印刷することでした。私はこれを機能させています。

そこで、データを読み取って保存し、そのデータを使用してインタラクティブな質問に対する回答を提供するという、より高度なものを検討しています。私の質問は、簡単にアクセスできるようにデータを保存する方法です。

私が最初に考えたのは、リストのリストを作成することでした。たとえば、

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

これはループ内で十分に簡単にアクセスできますが、アクセス方法は正確には使いやすいものではありません - 名前の代わりに数字としてのインデックス:

companyqty = companies[1][1]

またはループの場合:

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]

これにより、特定の会社にすぐにアクセスできますが、依然として数値インデックスに固執しています。

したがって、企業のリストと関連するすべてのデータを保持し、値に便利にアクセスできるように、これをオブジェクト指向の方法で構造化する方法を考えています。これまでの私のアイデアはすべて、上記のリストまたは辞書のように見えます。

それとも、この種の問題はオブジェクト指向のアプローチにはあまり適していないのでしょうか?

ありがとう

4

4 に答える 4

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」や「ブローカー名」などの属性や「getTotalValue」などの関数を持つポートフォリオのクラスも作成できます。

于 2013-08-17T15:25:58.013 に答える
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)
于 2013-08-17T15:24:25.987 に答える
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'}
   }
于 2013-08-17T15:28:02.763 に答える
0

それでも、Python で物事を行う方法は 1 つしかありません。この質問に対する答えは、何が「簡単にアクセスできるか」にかかっています。

プログラマーがオブジェクトとその属性に簡単にアクセスできるということですか? 次に、Company をクラスのインスタンスにして、価格、数量などの属性を提供するのが最善の方法です。おそらく、リストまたは辞書のロジックとは別に重要なロジックを使用しない限り、Portfolio というクラスを作成するのはやり過ぎです。ディクショナリに基づいてクラスを作成することもできるため、キーによるアクセスと属性によるアクセスの両方が可能になります。これは私が簡単にアクセスできるものです。例として、 webpy フレームワークの Storage クラスを見てください: https://github.com/webpy/webpy/blob/master/web/utils.py#L52

「簡単にアクセスできる」ということは、サードパーティのライブラリによってデータに対してシリアル化またはその他の処理が行われることを意味する場合、最も簡単な方法は、ライブラリが期待するデータ構造を使用することです。たとえば、JSON 形式は Python のリストや辞書に非常によく対応しています (Roman Pekar による回答を参照してください)。

于 2013-08-17T16:46:51.857 に答える