python中super与成员属性

Posted 善良的大猪猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中super与成员属性相关的知识,希望对你有一定的参考价值。

super的使用
直接看例子:
class A():
    def __init__(self, a):
        print(init A...)
        self.a = a


class B(A):
    def __init__(self, a):
        super(B, self).__init__(a)
        print(init B...)


class C(A):
    def __init__(self, a):
        super(C, self).__init__(a)
        print(init C...)


class D(B, C):
    def __init__(self, a):
        super(D, self).__init__(a)
        print(init D...)
        
        
d = D(2)
print(D.__mro__)

结果为:

init A...
init C...
init B...
init D...
(<class __main__.D>, <class __main__.B>, <class __main__.C>, <class __main__.A>, <class object>)

结论:

从运行结果上看,super继承和普通继承(普通继承只找父类)是不一样的。原因为它们的内部运行机制不一样,这一点在多重继承时体现得很明显。在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。
注意:super继承只能用于新式类,用于经典类时就会报错。
新式类:必须有继承的类,如果没什么想继承的,那就继承object
经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not classobj』

更详细的参考

http://blog.csdn.net/johnsonguo/article/details/585193%20

总结
  1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,
       产生了一个super对象;
  2. super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
  3. super(B, self).func的调用并不是用于调用当前类的父类的func函数;
  4. Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数
       只调用一次(如果每个类都使用super);
  5. 混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一
       个父类函数被调用多次。

super一般用于初始化__Init__()函数。将子类和所有的父类用super关联。

 

类成员方法改为‘值’

class Foo:

    def f1(self):
        return 123

    def f2(self,v):
        print(v)
    def f3(self):
        print(‘del‘)

    per = property(fget=f1,fset=f2,fdel=f3,doc=‘property操作‘)


obj = Foo()
ret = obj.per
print(ret)

obj.per = 123456

del obj.per

执行结果:

123
123456
del

 






















以上是关于python中super与成员属性的主要内容,如果未能解决你的问题,请参考以下文章

Python类之super()与私有属性

Python进阶-继承中的MRO与super

Python_12 多继承与多态

python初级010-构造方法,属性和迭代器

Python学习(类属性与实例属性)

Python编程基础20:实例成员与类成员