2016-07-09 4 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 오브젝트 ssaaa()Mysuper 클래스로 호출 할 수 있습니까?수퍼 객체의 속성

+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를 전달하면 자신을 수퍼 클래스의 인스턴스로 바인딩합니다. 자기를 생략하면 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__ 속성을 가져 오면 프록시 뒤에있는 객체의 인스턴스 속성 만 표시됩니다. 대신에 그 메소드는 그 프록시 뒤에있는 객체의 클래스 dict에 있습니다.

+2

downvotes를 설명하십시오! – Wombatz