差タイプ(obj)obj.__クラス__
-
21-08-2019 - |
質問
の違いは何ですか type(obj)
や obj.__class__
?がんの可能性 type(obj) is not obj.__class__
?
たいような関数を書くの作品を総称しの提供物は、デフォルトの値は1と同じタイプ別のパラメータとします。る変動、#1、#2は、以下に示すように、いいこんなことをしたのだろう。
def f(a, b=None):
if b is None:
b = type(a)(1) # #1
b = a.__class__(1) # #2
解決
type(obj)
とtype.__class__
は、古いスタイルのクラスのために同じように動作しません。
>>> class a(object):
... pass
...
>>> class b(a):
... pass
...
>>> class c:
... pass
...
>>> ai=a()
>>> bi=b()
>>> ci=c()
>>> type(ai) is ai.__class__
True
>>> type(bi) is bi.__class__
True
>>> type(ci) is ci.__class__
False
他のヒント
ことを義務付けられているが、回答ようだろう。さらに一般の場合で は 可能な新たなスタイルのクラスにより異なる値 type(instance)
や instance.__class__
:
class ClassA(object):
def display(self):
print("ClassA")
class ClassB(object):
__class__ = ClassA
def display(self):
print("ClassB")
instance = ClassB()
print(type(instance))
print(instance.__class__)
instance.display()
出力:
<class '__main__.ClassB'>
<class '__main__.ClassA'>
ClassB
その理由は ClassB
はを上書きする __class__
記述子が内部のtypeフィールドのオブジェクトが変更されません。 type(instance)
を読み込みから直接型の分野でを返します正しい値は、 instance.__class__
は新しい記述子に置き換え元の記述子によるPythonを、読み込み、内部のtypeフィールドの代わりにその内部のtypeフィールドを返しますハードコード値です。
古いスタイルのクラスである問題、ため息ます:
>>> class old: pass
...
>>> x=old()
>>> type(x)
<type 'instance'>
>>> x.__class__
<class __main__.old at 0x6a150>
>>>
すべてのクラスは今、新しいスタイルをしているので、Pythonの3で問題ありません; - 。)
のPython 2では、このクラスは、それがまたは暗黙的または明示的に設定し(例えばobject
、dict
、list
、...などのタイプで、組み込みset
と様々なを含む)別の新しいスタイルのクラスから継承する場合にのみ、新しいスタイルです__metaclass__
にtype
ます。