2017-03-15 5 views
-1

コードにベースポイント場合に同じままである:私はBase = ChildBを行うと基本クラス別

class Base(object): 
    def __init__(self): 
     print "Base created" 


class ChildB(Base): 
    def __init__(self): 
     super(ChildB, self).__init__() 

Base = ChildB 
Base() 

、塩基は、グローバルフレームにおいて、前Baseを延びるChildBを指します。 Pythonは動的に型付けされた言語なので、階層関係が変わると思います。そしてMROはスーパーリファレンスが

となりますが、結果はChildBがまだ元のBaseを拡張しているということを真実に伝えます。 なぜですか?

+0

実際にあなたが何をしようとしているのかは不明ですか? –

+0

この記事は役に立ちましたか?SOベテランのNed Batchelderによって書かれた[Pythonの名前と値に関する事実と神話](http://nedbatchelder.com/text/names.html)また、[その他の言語には「変数」があり、Pythonには「名前」があります。](http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables)素敵なダイアグラムと簡単な要約。 –

+0

@xiºSCから[__init __()メソッドを使ってPython super()を理解するのは私の質問です。 ](http://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods ) – MMMMMCCLXXVII

答えて

1

は、そのもともと呼ばPythonの変数BaseBaseあるクラスを混同しないでください。

>>> class Base(object): pass 
... 
>>> class ChildBase(Base): pass 
... 
>>> Base = ChildBase 
>>> Base.__name__ 
'ChildBase' 

ChildBaseが定義されている場合はそれがChildBaseの親クラスであるので、名前Baseはまだかかわらず、名前Baseがその後にバインドされているものの、クラスBaseにバインドされます。

Base = type('Base', (object,), {}) 

識別子Baseは、クラスの名前と結果のオブジェクトにバインドされた変数の両方に使用されている:class Base(object): passtypeへの呼び出しに相当するよう

クラスステートメントです。

関連する問題