码迷,mamicode.com
首页 > 编程语言 > 详细

python中super与成员属性

时间:2017-11-12 17:21:56      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:log   父类   成员   sdn   注意   ret   col   导致   子类   

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与成员属性

标签:log   父类   成员   sdn   注意   ret   col   导致   子类   

原文地址:http://www.cnblogs.com/MY0213/p/7821897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!