4

このPython 記述子を持っていると想像してください:

class MyDesc(object):
    def __get__(self, instance, instance_type=None):
        return 'Blue berries'
    def __set__(self, instance, value):
        print 'called with', instance, value

class MyClass(object):
    desc = MyDesc()

インスタンス引数で__set__呼び出される通常の実行方法はありますか? Noneつまり、次のようなことをしなくても

MyClass.__dict__['desc'].__set__(None, 'ants bees cats')

これらはそれをしないようです:

MyClass.desc = 'blah'
setattr(MyClass, 'desc', 'blah')

私が質問する理由は、このシナリオを回避するために Django で防御的なコーディングが行われているのを見て、それが必要かどうか疑問に思っているからです。

4

2 に答える 2

3

あなたがこのテストに疑問を呈するのは正しいと思いますし、私もこのコードinstanceに参加する方法を見つけることができません. Noneドキュメントはまた、それinstanceが決してできないことを明確にしているようNoneです:

object.__set__(self, instance, value)

所有者クラスのインスタンスinstanceの属性を新しい値 に設定するために呼び出されますvalue

私の推測では、それは正当な理由instanceでチェックインさNone__get__たものであり、同じテストが完全な模倣によって終了したものです。__set__

于 2013-05-07T08:27:52.380 に答える
0

__get__防御コーディングに関しては、インスタンスが on ( for で呼び出されますMyClass.desc)に存在するが、 on には存在しないことをチェックするコードがいくつか見られます__set__。発生しない理由__set__は、クラスで参照を設定すると、記述子参照全体が置き換えられるためです。

他のコードは、あなたの支援の有無にかかわらず、うまくいかない方法を見つけることができるという理由だけで、過度に防御的なプログラミングに反対することをお勧めします。積極的な悪用を防ぐのではなく、驚くべき結果を防ぐだけで十分です。

于 2014-03-25T20:31:35.637 に答える