1

たとえば、クラス宣言:

class Something(Superclass):
    an_attribute = 1
    another_attribute = 'hello'

このクラス宣言で定義されていることan_attributeをpythonが教えてくれる方法はありますか?another_attribute

この質問を組み立てる別の方法は、「dir結果が宣言されたクラスで結果をフィルタリングできますか? 」ということだと思います。

4

6 に答える 6

4

クラスの属性は、その特別な__dict__フィールドに保持されます。には、現在の__dict__クラスに定義されている属性 (および特殊な属性) のみが含まれます。他の人が述べたように、直接または組み込みvars()関数を介してアクセスできます。

Python が属性を詳細に処理する方法を説明しているこの記事を読むことを強くお勧めします。

于 2012-07-01T21:03:45.173 に答える
4

Python 2.7 :

class A:
    var1 = 2
    va2 = 2
class B(A):
    var3 = 3
    var4 = 4

print(A.__dict__.keys()) #prints ['va2', '__module__', 'var1', '__doc__']
print(B.__dict__.keys()) #prints ['var4', '__module__', '__doc__', 'var3']

パイソン 3:

print(list(A.__dict__)) #prints ['__module__', 'var1', '__dict__', 'va2', '__weakref__', '__doc__']
print(list(B.__dict__)) #prints ['var4', '__module__', '__doc__', 'var3']
于 2012-07-01T21:10:09.650 に答える
2

クラスの属性のディクショナリには、SomeThingからアクセスできますvars(SomeThing)のドキュメントvars()も参照してください。

于 2012-07-01T21:11:04.890 に答える
1
>>> class Something(list):
...     an_attribute = 1
...     another_attribute = 'hello'
... 
>>> print vars(Something) == Something.__dict__
True
>>> 
>>> print vars(Something)
{'__module__': '__main__', '__doc__': None, 'an_attribute': 1, '__dict__': <attribute '__dict__' of 'Something' objects>, '__weakref__': <attribute '__weakref__' of 'Something' objects>, 'another_attribute': 'hello'}
>>> 
于 2012-07-01T21:15:21.663 に答える
0

これを行う別の方法は、 @AshwiniChaudhary による例を使用して、introspectionを使用することです。

import inspect

class A:
    var1 = 2
    var2 = 2

class B(A):
    var3 = 3
    var4 = 4

[member for member in inspect.getmembers(B) if member not in inspect.getmembers(A)]
#prints [('var3', 3), ('var4', 4)]

このアプローチでは、継承階層のどのクラスからメンバーを「減算」するかを決定できます。次に例を示します。

class One:
    #members

class Two:
    #members

...

class N:
    #members

[member for member in inspect.getmembers(N) if member not in inspect.getmembers(NMinusK)]
于 2012-07-01T23:21:29.670 に答える
-2

組み込みの hasattr関数があります

hasattr(object, name)

文字列がオブジェクトの属性の 1 つの名前である場合、結果は True になり、そうでない場合は False になります。(これはgetattr(object, name)を呼び出し、例外が発生するかどうかを確認することで実装されます。)

于 2012-07-01T21:13:41.883 に答える