2016-07-09 10 views
2
class Mysuper(object): 

    def aaa(self): 
     print "In Superclass" 


class Mysub(Mysuper): 

    def aaa(self): 
     ss = super(Mysub, self) 
     print dir(ss) , type(ss) 
     print ss.__dict__ 
     ss.aaa() 
     print "In Subclass" 

>>> ob = Mysub() 
>>> ob.aaa() 
['__class__', '__delattr__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__self_class__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__thisclass__'] <type 'super'> 
{} 
In Superclass 
In Subclass 
>>> 

superの属性がaaaに登録されていないのはなぜですか? 属性がリストされていないので、superオブジェクトssは、Mysuperaaa()を呼び出すことができますか?スーパーオブジェクトの属性

+0

なぜあなたは 'aaa'属性を持つと思いますか? 'ss'は' Mysuper'クラスでもインスタンスでもなく、 'のインスタンスであると結論付けました。なぜ 'super'インスタンスに' aaa'メンバーが必要なのでしょうか? –

+0

@Rogalski別のクエリを追加しました。上記を参照してください。 – abc

+0

それは基本的にいくつかの '__getattribute__'魔法です。 [ソースを使用する、Luke!](https://github.com/python/cpython/blob/master/Objects/typeobject.c#L7393)。 'super_getattro'はあなたが望むものです。 –

答えて

-2

super(Mysub、self)にselfを渡すと、スーパークラスのインスタンスとしてselfがバインドされます。自己を省略すると、aaaは属性として表示されません。

0

メソッドは、dictクラスに含まれていますが、インスタンスdictではありません。

class C: 
    def method(self): pass 

print(C().__dict__) # prints {} 
print(C.__dict__) # prints a lot of stuff plus the method 

継承がここに役割を果たしていない:

が、これは参照してください。

superを使用する:

super:委譲する方法は、親や兄弟クラスに呼び出すことプロキシオブジェクトを返しますsuper(SomeType, some_instance)

あなたはオブジェクト、ないにプロキシを取得タイプと入力します。そのプロキシオブジェクトのdirを呼び出すと、定義されたメソッドや属性を含まないスーパーオブジェクトのインスタンスが取得され、__dict__属性を取得すると、プロキシの背後にあるオブジェクトのインスタンス属性のみが表示されます。代わりに、メソッドはそのプロキシの背後にあるオブジェクトのクラスdictにあります。

+2

downvotesを説明してください! – Wombatz