5

わかりました、ここで深刻な初心者の質問なので、非常に一般的な答えを探しています。私は Python を初めて使用し、言語は十分に単純に見えますが、問題に近づくと問題が発生します。静的型付き言語から来た私の最初の本能は、いくつかのオブジェクトを作成して、ロジックを簡潔でシンプルに保ちながら、関連するデータのバケットを渡すことができるようにすることです。

しかし、これはPythonのことですか?言語は動的に型付けされるため、オブジェクトを渡すことに意味はありますか? その場で設定できるのに、なぜ事前にフィールドを定義する必要があるのでしょうか? また、フィールドがない場合、オブジェクトをわざわざ扱う必要はありません。辞書が使えないのですが、基本的には同じですか?

データ アクセス コードをロジックから分離する必要がある場合は、プロパティ バケットを使用することをお勧めします。それとも、人々は Python でこれを行わず、単に辞書を使用しますか?

編集:

私が達成しようとしていることの基本的な考え方は次のとおりです。

JSON文字列を返すhttp APIがあります。その URL を urllib2 でヒットし、文字列として戻し、json.loads を使用して dict オブジェクトに変換したいと考えています。次に、mysql コードを別のクラスに分離したいと考えています。明らかに、20 個の値を渡したくありません。すべての値を含む dict が既にあるため、動的オブジェクトを作成して dict から各値を追加する利点は何ですか? データ アクセス クラスのすべての名前を知る必要がありますよね? 私は実際にはパフォーマンスについて話しているのではなく、デザインについて話しています。

4

4 に答える 4

4

具体的な要件を知らなくても、データを渡したい場合は、辞書の方がおそらく優れていると思います。値オブジェクトのようなものとは対照的に、開発者が特定の属性を検索する必要がある場合とは対照的に、それらは組み込みであり、高速でシンプルであり、すべてのプログラマーがそれらを理解しています。

例:

このコンテキストにも関連しています: Jack Diederich のStop writing classes (YT):

クラスは素晴らしいですが、使いすぎです。この講演では、実世界のコードから取ったクラスの過剰使用の例について説明し、それらから不要なクラス、例外、およびモジュールをリファクタリングします。

于 2013-01-05T03:53:41.427 に答える
2

読み取り専用データの場合、名前付きタプルが適しています。フィールド名で値にアクセスでき、ディクショナリよりもメモリ効率が高くなります。私の意見では、渡されるデータは読み取り専用にする必要があります。

編集:あなたのユースケースでは、辞書をパイプラインに渡すだけでよいと思います。データ ストレージのためだけにクラスを作成し、他のサービスを提供しないと、コードがさらに複雑になり、ほとんどメリットがありません。

于 2013-01-05T04:20:20.573 に答える
0

あなたは実際に両方の多くを見つけます。コードが「厳密に Python」である場合、人々は POPO タイプまたは DTO タイプのオブジェクトを作成しない傾向があります。人々は、必要なデータについて渡すだけの傾向があります。ただし、他のサービスと通信している場合、通信の配管により、処理しなければならないより重い型のオブジェクトが作成される可能性があります (たとえば、Suds は、サービス内のデータ型を Python オブジェクトにかなり厳密にマッピングします)。

幸いなことに (またはそうでない場合もあります)、両方の長所を活用することができます。次のような「一般的な DTO」が表示される場合があります (必ずしも良いとは限りませんが、pythonic です)。

   class Person:
     def __init__(self, *args, **kwargs):
       self.__dict__ = kwargs

surnameそのため、それらに設定されたプロパティや型のプロパティはありませんgivenNameが、構文糖衣のためだけにそれらを追加できます。(リスト内包表記をしている場合に便利です):

last_names = [x.surname for x in people]
于 2013-01-05T03:59:48.227 に答える
0

キーがどうなるかわからなかったので、一般的なキーと値のデータ型が必要でない限り、辞書は使用しません。C++ などでオブジェクトを使用するすべてのケースで、Python でオブジェクトを使用できますし、おそらく使用する必要があります。

その理由は、 a を使用できますがdict、カプセル化や抽象化が提供されないためです。静的に型付けされた言語から来たとしても、この利点を理解する必要があります。dictその値を検証することはできません。dictの構造を文書化したり、その構造に名前を付けるのに便利な場所はありません。

興味深いことに、Python オブジェクトの属性は辞書です。これをチェックしてください:

>>> class Foo(object):
...   def __init__(self):
...     self.cat = 'meow'
...     self.dot = 'woof'
... 
>>> f = Foo()
>>> f.__dict__
{'dot': 'woof', 'cat': 'meow'}

そして、クラスを次のようにすることができますdict:

>>> class Animals(object):
...   def __getitem__(self, key):
...     if key == 'cat':
...       return 'meow'
...     if key == 'dog':
...       return 'woof'
...     raise KeyError(key)
... 
>>> a = Animals()
>>> a['cat']
'meow'
>>> a['dog']
'woof'
于 2013-01-05T04:00:09.253 に答える