超级对象的属性

时间:2016-07-09 17:37:54

标签: python python-2.7 super

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

2 个答案:

答案 0 :(得分: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__属性仅显示该对象后面的对象的实例属性代理。这些方法再次出现在该代理背后的对象的类字典中。

答案 1 :(得分:-2)

当你将自己传递给super(Mysub,self)时,你将自己绑定为超类的一个实例。如果省略self,则不会将aaa视为属性。