65

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
4

3 に答える 3

67

これは古い質問ですが、それについて言及している回答はないようです。一般的なケースでは、新しいスタイルのクラスが と に対して異なる値を持つことは可能です: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(instance)はその型フィールドから直接読み取るため、正しい値を返しますがinstance.__class__、内部型フィールドを読み取る Python によって提供された元の記述子を置き換える新しい記述子を参照します。その内部型フィールドを読み取る代わりに、ハードコーディングされた値を返します。

于 2012-05-17T09:50:40.837 に答える
33

古いスタイルのクラスが問題です。

>>> class old: pass
... 
>>> x=old()
>>> type(x)
<type 'instance'>
>>> x.__class__
<class __main__.old at 0x6a150>
>>> 

すべてのクラスが新しいスタイルになっているため、Python 3 では問題ありません;-)。

Python 2 では、別の新しいスタイルのクラス ( 、、 、 ...objectなどのさまざまな組み込み型を含む) から継承するか、暗黙的または明示的に に設定されている場合にのみ、そのクラスは新しいスタイルです。dictlistset__metaclass__type

于 2009-06-29T21:02:10.260 に答える
20

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
于 2009-06-29T21:04:00.817 に答える