6
class a_class:
    def __getattr__(self, name):
        # if called by hasattr(a, 'b') not by a.b
        # print("I am called by hasattr")
        print(name)

a = a_class()
a.b_attr

hasattr(a, 'c_attr')

中のコメントを見てください__getattr__。それ、どうやったら出来るの?私はPython 3を使用しています。その理由は、属性を動的に作成したいのですが、hasattrを使用するときにそれを行いたくないからです。ありがとう。

4

2 に答える 2

10

カンニングなしではできません。ドキュメントが言うように:

これ[つまりhasattr]は、呼び出しgetattr(object, name)て例外が発生するかどうかを確認することで実装されます。

言い換えれば、hasattrblocking なしでブロックgetattrすることはできません。これは基本的に、hasattr属性へのアクセスを気にする場合、まったくブロックできないことを意味します。

「ごまかし」とは、賢明な人々がここに投稿するのを好むこれらのソリューションの 1 つを意味し、本質的にすべての Python のエンドランを伴います。通常、ビルトインの再割り当て、コール スタックの検査/操作、イントロスペクションを使用したリテラル ソース コードの覗き見、オブジェクトの「秘密の」内部属性の変更などが含まれます。たとえば、コール スタックを調べて、hasattrがコール チェーンにあるかどうかを確認できます。このタイプのソリューションは可能ですが、非常に壊れやすく、将来の Python バージョン、CPython 以外の実装、または別の同様に醜い悪意のあるハックも使用されている状況で壊れる可能性があります。

ここで同様の質問といくつかの議論を見ることができます

于 2013-09-14T03:12:01.110 に答える