0

このことを考慮:

>>> import math
>>> dir(math)
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'hypot', 'isinf', 'isnan', 'ldexp', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

__dict__リストされていませんが、私はまだすることができます

>>> math.__dict__

と同じこと

>>> class MyClass(object):
         def __init__(self, var1, var2):

             self.a = var1
             self.b = var2

         def __call__(self, arg):

             print " The arg passed is ", arg

>>> dir(MyClass) 

['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

__bases__リストされて__base__いませんが、私はまだ行うことができます:

>>> MyClass.__bases__
(<type 'object'>,)
>>> MyClass.__base__
<type 'object'>

質問:

Pythonオブジェクトから到達可能なすべての属性を事前に知るまたは伝えるにはどうすればよいですか?この場合、mathモジュールが持っていること__dict__MyClass持っていること、__base__そして持っていることをどのように知ることができ__bases__ますか?

4

1 に答える 1

2

完全に一般的なものを探している場合、属性ルックアップは動的であるため、それを行う方法はありません。ドキュメントが言うように:

そのオブジェクトの有効な属性のリストを返そうとします。

そこにあるキーワードは「試み」です。下方に:

注dir()は主に対話型プロンプトで使用するための便宜のために提供されるため、厳密にまたは一貫して定義された名前のセットを提供するよりも、興味深い名前のセットを提供しようとします。その詳細な動作はリリースごとに変わる可能性があります。 。たとえば、引数がクラスの場合、メタクラス属性は結果リストに含まれません。

事実上、それができることは__dict__、オブジェクト、そのタイプ、およびそのタイプの基本クラスを調べることだけです。(次に、いくつかのことを差し引きます。たとえば、通常は気にしないメタクラス属性の公開を避けるために、型の型の属性はスキップされます)。正確な詳細が必要な場合は、上記のリンク先のドキュメントをお読みください。

一方、オブジェクトに上記と同等の__getattr__/ __setattr__/ 、、、__delattr__または__getattribute__C-APIがある場合、辞書にないすべての種類の属性、場合によってはそれらの無限のセットが含まれている可能性があります。例えば:

class C(object):
    def __getattr__(self, name):
        return name
c = C()
print(c.a)

これは印刷されaます。しかし、それが存在することをどうやっdirて知ることができるc.aでしょうか?私のコードを解釈できたとしても、考えられるすべての文字列のリストを出力する必要がありますが、これは明らかに望ましくありません。

インタプリタによって隠蔽された特別な方法で処理される特別な属性名もあります。

また、どのオブジェクトでも、必要__dir__なものを返すメソッドを定義できます。

あなたが特定の何かを探しているなら、あなたはおそらくそれをすることができます。たとえば、メタクラス属性を差し引かずに属性を取得しようとしている場合、それは(重複を削除するために)ただdir(x) + dir(type(x))、またはおそらくより良いです。dir(x) + [a for a in dir(type(x)) if a not in dir(x)]

ただし、オブジェクトのすべての属性を知りたい場合は、わかりません。

于 2013-02-02T00:57:46.303 に答える