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

Python super初始化理解过程

时间:2016-08-07 06:18:52      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

Python中子类调用父类的方法有两种方法能够实现:调用父类构造方法,或者使用super函数(两者不要混用)。

使用“super”时经常会出现代码“super(FooChild,self).__init__(xxx,xxx)”。那super().__init__()到底要怎么用呢?

为了方便理解,我写了如下例子验证用法:

#-*- coding:utf-8 -*-
class A(object): def __init__(self,xing,gender): #!#1 self.namea="aaa" #!#2 self.xing = xing #!#3 self.gender = gender #!#4 def funca(self): print "function a : %s"%self.namea class B(A): def __init__(self,xing,age): #!#5 super(B,self).__init__(xing,age) #!#6(age处应为gender) self.nameb="bbb" #!#7 ##self.namea="ccc" #!#8 ##self.xing = xing.upper() #!#9 self.age = age #!#10 def funcb(self): print "function b : %s"%self.nameb b=B("lin",22) #!#11 print b.nameb print b.namea print b.xing #!#12 print b.age #!#13 b.funcb() b.funca()

通过更改代码中标记#!#几行的输入参数来验证super的用法,并得出以下结论:

1.B类继承A类,在B类自己的基础上可以调用A类所以的方法,代码最后两行b.funcb()\b.funca()可以正常运行。

2.A、B同时拥有__init__,B会改写A中的__init__方法,A类的方法失效,通过注释(#)掉#!#6行代码、恢复#89行代码,运行后可得。

3.super函数可以调用A父类中的属性,如namea、xing,B类中有同名属性时,覆盖A类中的同名属性。

4.B类__init__(#5)参数需大于或等于A父类的__init__方法,因为super初始化了,参数量为父类参数量。

5.super函数原理:super().__init__(xxx,xxx)中的xxx参数为类B(#5)中输入的参数,但与类A中参数名相对应。如上面那段代码#6中输入的是age参数,虽然运行结果并没错(因为没有运行.gender),但是其实这个age参数是赋值到A类的gender参数上的(本文末的第二段代码有相关例子,代码加#####处)

6.使用super函数时,可将B子类中(#5)与A类相同的参数依次写入__init__(xxx)的xxx参数中(注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出,也不能写),之后可再次重写xxx中参数属性,#5中多余参数可自定义属性

 

 

class A(object):
    def __init__(self,xing,gender):
        self.namea="aaa"
        self.xing = xing
        self.gender = gender
        
    def funca(self):
        print "function a : %s"%self.namea
 
class B(A):
    def __init__(self,xing,gender,age):
        super(B,self).__init__(xing,age)
        self.nameb="bbb"
        ##self.namea="ccc"
        self.xing = xing.upper()        
        self.age = age + 1
        #self.gender = gender.upper()
        
    def funcb(self):
        print "function b : %s"%self.nameb
 
b=B("lin","nan",22)
print b.nameb
print b.namea
print b.xing
print b.age
b.funcb()
b.funca()
print b.gender   #####

输出结果:  

bbb
aaa
LIN
23
function b : bbb
function a : aaa
22   #####

 

 

Python super初始化理解过程

标签:

原文地址:http://www.cnblogs.com/HoMe-Lin/p/5745297.html

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