2016-07-09 2 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 
>>> 

Почему атрибут aaa не указан для super? Поскольку атрибут не указан как super объект ss можно позвонить aaa() в классе Mysuper?Атрибуты супер объекта

+0

Зачем вам ожидать, что у него будет атрибут 'aaa'? Вы уже сделали вывод, что 'ss' не является ни классом Mysuper, ни его экземпляром, но является экземпляром' '. Почему именно экземпляр 'super' должен иметь член' aaa'? –

+0

@Rogalski Добавлен другой запрос, см. Выше. – abc

+0

В основном это волшебство '__getattribute__'. [Используйте источник, Люк!] (Https://github.com/python/cpython/blob/master/Objects/typeobject.c#L7393). 'super_getattro' - это то, что вы хотите. –

ответ

-2

Когда вы передаете себя супер (Mysub, 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) вы получите прокси к объекта, а не type. Поэтому вызов dir на этом прокси-объекте даст вам экземпляр экземпляра супер объекта, который не содержит никаких ваших определенных методов или атрибутов, и получение атрибута __dict__ показывает только атрибуты экземпляра объекта за прокси-сервером. Вместо этого методы снова находятся в классе dict объекта за этим прокси.

+2

Пожалуйста, объясните downvotes! – Wombatz

Смежные вопросы