0

古いスタイルと新しいスタイルの python クラスまたはオブジェクトを区別するための単純なユーティリティ関数は何ですか?

以下は正しいですか、完全ですか:

isNewStyle1 = lambda o: isinstance(hasattr(o, '__class__') and o.__class__ or o, type)
isNewStyle2 = lambda o: hasattr(o, '__class__') and type(o) == o.__class__ or False

そうでない場合は、解決策を提供できますか。もしそうなら、チェックを行うより良い方法はありますか?

上記を使用して、問題はありませんでしたが、パラメーターとして提供されたすべてのオブジェクトで機能するという 100% の信頼はありません。

4

2 に答える 2

1

どうですか:

class A: pass

class B(object): pass


def is_new(myclass):
    try: myclass.__class__.__class__
    except AttributeError: return False
    return True

>>> is_new(A)
False
>>> is_new(B)
True
>>> is_new(A())
False
>>> is_new(B())
True
>>> is_new(list())
True
于 2012-05-24T04:06:04.033 に答える
0

なぜだけではないのですか

type(my_class) is type

True新しいスタイルのクラスFalse用、クラシックなクラス用

このような異なるメタクラスを持つクラスをサポートできます (メタクラスがサブクラス化型である限り)

issublass(type(myclass), type)
于 2012-05-24T02:53:10.060 に答える