2016-04-29 4 views
1

更新typeのインスタンスであるが、同時に、objecttypeの基本クラスです。 typeobjectのインスタンスです。私は本当にこれについて混乱しています。それは完全に非論理的です。なぜPythonでこれを行うのですか?Python3どのようにオブジェクト内にmroが定義されていますか? ------------------</p> <p><code>object</code>

>>> isinstance(object,type) 
True 
>>> isinstance(type,object) 
True 
>>> type.__bases__ 
(<class 'object'>,) 

オリジナル--------------------------------

私はtypemroを持って知っています。私はなぜmroobjectから呼び出せるのか理解できません。どのようにこれを実装するpython?

>>> object.mro() 
[<class 'object'>] 
>>> 'mro' in dir(object) 
False 
>>> 'mro' in object.__dict__ 
False 
>>> 'mro' in dir(type) 
True 
>>> 'mro' in type.__dict__ 
True 
>>> issubclass(type,object) 
True 
+0

クラス属性は常にインスタンスからアクセスすることができますので。 –

+0

@Ignacio Vazquez-Abramsありがとうございますが、まだ混乱しています – tcpiper

+1

@ IgnacioVazquez-Abramsそれは全体の話ではありません、 'type.mro!= object.mro'です。 – augurar

答えて

1

Descriptorsが含まれる。

object.mroを解決する場合、通訳者はまず'mro'object.__dict__に探します。

>>> object.__dict__['mro'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'mro' 

'mro'object.__dict__ではないので、インタプリタはtype(object).__dict__に見えます。それは__get__メソッドを持っているので

>>> type(object).__dict__['mro'] 
<method 'mro' of 'type' objects> 

このオブジェクトは記述子です。したがって、インタプリタは__get__メソッドを呼び出して、実際の値object.mroを取得します。あなたはobjectがクラスであるので、それは__get__(None, object)を呼ぶだろうが、この場合にはobjectがクラスtypeのインスタンスとして検討されているので、インタプリタが結果を得るために__get__(object, type(object))を呼び出すと思うかもしれない文書に基づいて

>>> type(object).__dict__['mro'].__get__(object, type(object)) 
<built-in method mro of type object at 0x1047d2ae0> 

結果は、我々が探しているものであることを確認するには、次の

>>> type(object).__dict__['mro'].__get__(object, type(object)) == object.mro 
True 
>>> type(object).__dict__['mro'].__get__(object, type(object))() 
[<class 'object'>] 
関連する問題