11

コード:

import types


class C(object):
    pass


c = C()
print(isinstance(c, types.InstanceType))

出力:

False

オブジェクトが新しいスタイルのクラスのユーザー定義クラスのインスタンスであるかどうかを確認する正しい方法は何ですか?

UPD:

オブジェクトのタイプがユーザー定義であるかどうかをチェックするかどうかをさらに強調したいと思います。ドキュメントによると:

types.InstanceType ユーザー定義クラス
のインスタンスのタイプ。

UPD2:

了解しました。「正しい」方法ではありません。

UPD3:

setまた、モジュール内にのタイプがないことに注意してくださいtypes

4

4 に答える 4

9

新しい/古いスタイルのクラスとユーザー/組み込みオブジェクトの両方を区別するためのハッキーな方法として、チェックをまたx.__class__はの存在(または存在しない)と組み合わせることができます。'__dict__' in dir(x)hasattr(x, '__slots__')

実際、これとまったく同じ提案がhttps://stackoverflow.com/a/2654806/1832154に表示されます

def is_instance_userdefined_and_newclass(inst):
    cls = inst.__class__
    if hasattr(cls, '__class__'):
        return ('__dict__' in dir(cls) or hasattr(cls, '__slots__'))
    return False

>>> class A: pass
... 
>>> class B(object): pass
... 
>>> a = A()
>>> b = B()
>>> is_instance_userdefined_and_newclass(1)
False
>>> is_instance_userdefined_and_newclass(a)
False
>>> is_instance_userdefined_and_newclass(b)
True
于 2013-02-01T20:40:38.810 に答える
7

「正しい」方法についてはわかりませんが、それをテストする簡単な方法の1つは、古いスタイルのクラスのインスタンスのタイプが実際のクラスではなく「インスタンス」であるということです。

したがってtype(x) is x.__class__、またはtype(x) is not types.InstanceType両方が機能するはずです。

>>> class Old:
...     pass
...
>>> class New(object):
...     pass
...
>>> x = Old()
>>> y = New()
>>> type(x) is x.__class__
False
>>> type(y) is y.__class__
True
>>> type(x) is types.InstanceType
True
>>> type(y) is types.InstanceType
False
于 2013-01-30T20:20:59.320 に答える
1

これは、そうである場合はTrueを示します。

if issubclass(checkthis, (object)) and 'a' not in vars(__builtins__):print"YES!"

2番目の引数は、チェックするクラスのタプルです。これは理解しやすく、うまくいくと確信しています。[編集(オブジェクト)から(オブジェクト、)ありがとうダンカン!]

于 2013-02-02T16:23:20.287 に答える
0

おそらく、除去メソッドを使用できます-オブジェクトがユーザー定義クラスのインスタンスであるかどうかを明示的にisinstance(object, RightTypeAliasForThisCase)チェックするのではなく、オブジェクトが「基本」タイプの1つではないかどうかをチェックします。

于 2013-01-30T21:03:07.413 に答える