9

この投稿から - Python で型をチェックする正規の方法は何ですか? 、このコードを使用して、オブジェクト o が文字列型であることを確認できます。

o = "str"; print type(o) is str --> True

ただし、ユーザー定義型でtype(a) is Aは機能しないようです。

class A:
    def hello(self):
        print "A.hello"
a = A()

print type(a) is A # --> False
print type(a) == A # --> False

どうしてこれなの?ユーザー定義型の正しい型チェックを取得するにはどうすればよいですか? Mac OS X で Python 2.7 を使用しています。

PS: これは好奇心からの質問です。この本からこの例を取得した結果、true になりましたが、false になりました。ダックタイピングがPythonで推奨される方法であることを理解しています。( https://stackoverflow.com/a/154156/260127 )

追加した

ロドリゴの答えは私にとってはうまくいきます。「isinstance」を使用しても正確な型はわかりません。オブジェクトがクラスまたはサブクラスのインスタンスであるかどうかをテストするだけです。

class C(A):
    def hello(self):
        print "C.hello"

a = A()
c = C()

print isinstance(a, A) --> True
print isinstance(c, A) --> True
print isinstance(a, C) --> False
print isinstance(c, C) --> True
print "----"
print type(a) == A --> True
print type(c) == A --> False

追加 2

jdurango の回答 ( a.__class__ is A) から、かなり興味深い Java の同等物が得られました。

a.getClass() == A.class <--> a.__class__ == A (a.__class__ is A)
a isinstance A <--> isinstance(a, A)
c isinstance A <--> isinstance(c, A)

どれがどれをコピーしたかわかりません。

4

4 に答える 4

14

新しいスタイルのクラスを使用する必要があります。

class A(object):
    pass

つまり、 から派生しobjectます。

問題は、古いスタイルのオブジェクトがすべての型であるかのように実装されていることですinstance

から直接的または間接的に派生さobjectせると、この問題が解決されます。または、古いスタイルのクラスがなくなった Python3 に移行します。

于 2013-02-03T00:30:52.427 に答える
7

これを試して

print a.__class__ is A
True
于 2013-02-03T00:36:10.387 に答える
7

なぜ使用しないのisinstance(instance, class)ですか?

>>> class A:
...     def hello(self):
...        print "A.hello"
... 
>>> type(A)
<type 'classobj'>
>>> a = A()
>>> type(a)
<type 'instance'>
>>> isinstance(a, A)
True
于 2013-02-03T00:31:02.550 に答える
2

alikeを定義しているa = A()場合aは、クラスのインスタンスですA。を行っているだけa = Aの場合、名前aはクラス オブジェクトを指します。

おそらくのインスタンスが必要でAあり、それをテストできます

>>> a = A()
>>> isinstance(a, A)
True

ただし、新しいスタイル クラスは True をテストしtype(A()) == Aます。

于 2013-02-03T00:32:03.867 に答える