63
class A(object):
    def get_class(self):
        return self.__class__

class B(A):
    def __init__(self):
        A.__init__(self)

b = B()
print b.get_class()

このコードは<class '__main__.B'>.

メソッドが定義されているクラス名 (つまり ) を取得するにはどうすればよいAですか?

4

3 に答える 3

86

ドキュメントから: https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy

クラス オブジェクトには__name__属性があります。派生クラスの属性を介して基本クラスをイントロスペクトする方がクリーンな__bases__場合があります (たとえば、コードが派生クラスに存在する場合)。

>>> class Base(object):
...     pass
...
>>> class Derived(Base):
...     def print_base(self):
...         for base in self.__class__.__bases__:
...             print base.__name__
...
>>> foo = Derived()
>>> foo.print_base()
Base
于 2012-04-10T15:57:47.530 に答える
62

inspect.getmro(cls)

clsを含むクラスclsの基本クラスのタプルをメソッド解決順に返します。このタプルにクラスが2回以上表示されることはありません。メソッドの解決順序はclsのタイプに依存することに注意してください。非常に特殊なユーザー定義のメタタイプが使用されていない限り、clsはタプルの最初の要素になります。

import inspect
inspect.getmro(B)

結果は次のようになります。

(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

最初の要素はクラス自体であり、2番目の要素は常に親の最初です。その後、物事は少し複雑になる可能性があります。

于 2012-04-10T16:17:24.920 に答える
-6

あなたは変えることができます

return self.__class__

return A().__class__

利用可能な A() の他のインスタンスがないため...

于 2012-04-10T15:53:12.980 に答える