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

时间: 2024-09-27 09:13:08

python中super与成员属性的相关文章

python中super出现的TypeError: must be type, not classobj 原因及解决

执行一下代码,出现错误,TypeError: must be type, not classobj class A():    def __init__(self):        print("Enter A")        print("Leave A") class B(A):    def __init__(self):        print("Enter B")        super(B, self).__init__()  

python中super().__init__和类名.__init__的区别

super().__init__相对于类名.__init__,在单继承上用法基本无差 但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次 多继承时,使用super方法,对父类的传参数,应该是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错 单继承时,使用super方法,则不能全部传递,只能传父类方法所需的参数,否则会报错 多继承时,相对于使用类名.__init__方法,要把每个父类全部写一遍, 而使用super方法

python中的特殊成员

python中的特殊成员: 小甲鱼论坛总结 原文地址:https://www.cnblogs.com/q767498226/p/10146661.html

python中string模块各属性以及函数的用法

任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求: python的字符串属性函数 python的string模块 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 字符串属性函数 系统版本:CentOS release 6.2 (Final)2.6.32

Python 中Super的使用(二)

1.如何使用super 一开始照着示例代码去用super的时候,觉得这个东西很简单,就像其他的单继承机制的语言中的super一样好用,好理解.可是,当你试着混合诸如bound super  object,与unbound super object,metaclass,proxy object,descriptor,MRO,multiple inheritance 这样的概念一起来理解的时候,脑子就会变大,感觉这个东西后面的机制好复杂,一时半会真的很难弄清楚. 看了别人写的一些东西之后,尤其是是看

python中super关键字的用法

class A: def __init__(self):    print "enter A"    print "leave A" class B(A): def __init__(self):    print "enter B"    A.__init__(self)   # old method    print "leave B" >>> b = B() enter B enter A leave

Python中super()的使用(一)

1.super被引入的初衷 super()通常是被说成super函数,其实它是一个内置的类,是在Python2.2中新增加的,super()实例化一个super对象,这个super对象充当一个访问代理的角色,它帮助子类的对象访问父类,祖父类以及所有祖先类中被方法(尤其是访问那些被子类重写的方法). 在super类没有出现以前,如果要在子类方法中去调用父类的方法,必须显式的使用父类的类名,用一种非绑定的方式去调用.如下例子(所有例子程序均在Python3.4下实现)所示: class A(): d

python中super的使用

转自:http://python.jobbole.com/86787/ super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如: class Animal(object): def __init__(self, name): self.name = name def greet(self): print 'Hello, I am %s.' % self.

Python中的类方法及属性总结举例,编写memcached启动脚本举例

1.类的属性总结类属性,也是公有属性, 类的私有属性, 对象的共有属性, 对象的私有属性, 内置属性, 函数的局部变量, 全局变量, #/usr/bin/env python # -*- coding:utf-8 -*- class MyClass(object): var1 = '类属性,类的公有属性 var1' __var2 = '类的私有属性 __var2' def func1(self): self.var3 = '对象的公有属性 var3' self.__var4 = '对象的私有属性