7

Python では、定義するクラスの外から任意の属性を割り当てることができます。

class Profile(models.Model):
    user = models.OneToOneField(User)  
    name = models.CharField(max_length=140)

p = Profile()
p.age = 42

ここでの基本的なメカニズムは__dict__、すべての属性の辞書を維持する属性です。

私たちは皆、内部の仕組みをクライアント コードに公開しないように言われましたが、新しいデータを添付することはカプセル化とはまったく関係ありませんよね? このイディオムは Python コードで一般的ですか?


つまり…</h2>

それぞれに、、、などのTweet標準フィールドがあります。 ユーザーのつぶやきリストを返すときに、このユーザーがつぶやきを「お気に入り」に設定しているかどうかを表示します。idtextowner

明らかに、これを取得is_favoriteするには、多対多の関係を照会する必要がありますuser現在のユーザーに対応するオブジェクトを事前に入力
しても問題ありませんか?Tweetis_favorite

確かにメソッドを公開できましたが、テンプレート内から引数を使用してメソッドを呼び出すことを許可しないDjango テンプレート言語のis_favorite_for(user)制限にぶつかっています。また、テンプレートがメソッドを呼び出すべきではないと思います。


これで問題なく動作することはわかっていますが、オープン ソース プロジェクトでそのようなことを行うと、他の開発者が私を軽蔑するようになるのではないかと考えています。

サイドノート:

私は、動的型がごく最近導入された C#/.NET のバックグラウンドから来ており、いくつかのニッチな領域 (相互運用性、IoC フレームワーク、REST クライアント フレームワークなど) を除いて広く適応されていません。

4

3 に答える 3

7

私の見解では、それは悪い習慣です。

オブジェクトは、その属性をいじっていることを知りません。Profileたとえば、が後で拡張されて、コード内でとageは関係のない という属性を持つとどうなるかを考えてみましょう。p.age

属性を追加したい場合は、 をサブクラス化したり、カスタム属性を持つオブジェクトに をProfile外部マッピングしたりしないでください。Profiles

于 2011-10-28T16:40:43.213 に答える
4

答えは次のとおりだと思います。まず、本当にそれを防ぎたい場合__slots__は、クラスで定義することでできます。また、クラスで実際に定義されていない属性を追加することは、コードを読んでいる人を混乱させる可能性があり、ほとんど役に立たないため、一般的には良い習慣ではありません。

しかし、場合によっては、これを実行できると便利です。Python のドキュメントでは、C 構造体または Pascal Record に似たものを取得する方法としてこれについて説明しています ( http://docs.python.org/tutorial/classes.htmlを参照)。セクション 9.7 オッズ アンド エンドの下で。)

于 2011-10-28T16:42:36.597 に答える
3

属性が時々しか存在しない場合AttributeError、コードが同じクラスの別のオブジェクトに対して正常に機能している間に、あるオブジェクトに対してどこからともなく出てくる危険性があります (そうです、ダックタイピングでは正確な型はそれほど重要ではありませんが、同じオブジェクトクラスはしばしば同じ「ダックタイプ」であると想定されます)。発生しない場合でも、コードの一部を見ただけではわかりませんし、いずれにせよ確認するのははるかに困難です。したがって、これを行うと、コードの信頼性が低下するだけです。

次に、デフォルト属性をクラス属性またはプロパティとして提供し、デフォルトと異なる場合にのみオブジェクト属性を割り当てるオプションがあります。ただし、オブジェクトごとに異なることが予想されるものについては、すべての属性を一覧表示することの明快さは、__init__通常、インスタンス属性へのアクセスを遅らせることの潜在的な利点を上回ります。

それが受け入れられないと言っているわけではありませんが、それが良い考えであると見なされるには、説得力のある議論をする必要があります.

于 2011-10-28T16:45:57.610 に答える