Python语言之面向对象——基本继承
小标 2018-07-17 来源 : 阅读 820 评论 0

摘要:本文主要向大家介绍了Python语言之面向对象——基本继承,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了Python语言之面向对象——基本继承,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

概念:子类继承父类的属性和方法。

一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。

一、单继承 :推崇。特点和使用

eg:

class Parent(object):

parentAttr = 100

def __init__(self):

print 'Calling parent constructor'

self.name='dengxiaoping'

def parentMethod(self):

print 'Calling parent method'

def setAttr(self, attr):

Parent.parentAttr = attr

def getAttr(self):

print 'Parrent attribute:',Parent.parentAttr

 

class Child1(Parent):

def __init__(self):

print 'Calling child1 constructor'

def childMethod(self):

print 'Calling child1 method'

Parent.parentMethod(self)

class Child2(Parent):

def childMethod(self):

print 'Calling child2 method'

self.parentMethod()

 

1、父类构造方法的继承

c1=Child1()

这一句是创建实例对象时,就会自动去调类的构造方法__init__进行初始化工作,如果子类中没有实现构造方法__init__,就会直接调用父类的构造方法

c1=Child1() #Calling child1 constructor

Child1() 创建实例对象:子类中有自己的构造函数,所以父类的构造函数不在起作用

print c1.name 报错

print c1.parentAttr #100 类属性直接继承过来

c2=Child2() #Calling parent constructor

Child2() 子类中没有构造方法,完全继承父类的构造方法,

print c2.name #dengxiaoping

总结:构造方法需要在其派生类的构造方法中专门调用,即子类不会主动继承基类的构造方法。

2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数

子类调用父类的方法有两种方式:

1、Parent.parentMethod(self)

2、self.parentMethod()

第一种是直接用父类的类名.方法名去调用父类的方法,但是需要注意的是,这种调用方法必须将self作为参数传进去并且作为第一个参数,表示指向这个类的实例本身。这种方法多用于方法重写时。

第二种是直接用self去调用父类的方法,为什么可以这样调用呢?因为一旦子类继承了父类,那么子类就拥有父类所有的公有方法和属性,所以此时父类的方法和属性就相当于子类自己了,所以可以直接用self去直接调用实例的方法,而不用再传入self参数了。

class Child1(Parent):

def __init__(self):

print 'Calling child1 constructor'

def childMethod(self):

print 'Calling child1 method'

Parent.parentMethod(self) #调用基类的方法,所以要加上参数self

这里:Parent.parentMethod(self)可以使用self.parentMethod()替换,

class Child2(Parent):

def childMethod(self):

print 'Calling child2 method'

self.parentMethod() #子类调用自己从父类那继承过来的父类的方法

 

 

3、在子类中引用父类的构造方法:

(1)superclassname.__init__(self,params) 尽量使用第一种

(2)super(subclassname,self).__init__(params) 这一种不支持多继承

class Child1(Parent):

def __init__(self):

Parent.__init__(self)

print 'Calling child1 constructor'

第二种:

class C(A):

def __init__(self):

super(C, self).__init__() #调用基类构造方法

 

4、通过构造方法,把变量从子类传到父类

如果基类构造方法需要传入参数时,创建子类的实例对象时,就必须传入对应的参数,否则会报参数数量不匹配的错。

class Parent(object):

parentAttr = 100

def __init__(self,name,age):

print 'Calling parent constructor'

self.name = name

self.age = age

 

class Child1(Parent):

def __init__(self,name,age):

Parent.__init__(self,name,age)

print 'Calling child1 constructor'

 

5、通过实例方法,把变量从子类传到父类

def parentMethod(self,name):

print 'Calling parent method'

print 'your old name is %s'%self.name

print 'your new name is %s'%name

 

def childMethod(self,name):

print 'Calling child1 method'

Parent.parentMethod(self,name)

 

6、Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找需要调用的方法,找不到才去基类中找)

新式类按照广度优先去查找,继承object的是新式类

经典类按照深度优先的方式去查找

 

7、子类只继承父类所有公有的属性和方法,并且也可以在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来访问的。

 

8、继承的本质

对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

 

二、类间的关系判断

isinstance() 判断是否是实例

issubclass() 判断是否是子类

isinstance(c1,Child1)

issubclass(Child1,Parent)

issubclass(Child1,object)

 

三、多重继承:不建议使用多继承

一个子类继承多个父类

调用父类构造函数:superclassName.__init__(self, [parameter1[,parameter2....]] )

调用父类中的函数:Parent.parentMethod(self)

class D(object):

def bar(self):

print 'D.bar'

 

class C(D):

def __init__(self):

print 'B init'

def bar(self):

print 'C.bar'

 

class B(D):

def __init__(self):

print 'B init'

def bar(self):

print 'B.bar'

 

class A(B,C): 多重继承

def bar(self):

print 'A.bar'

a1=A() # B init 多重继承时,默认继承的第一个父类的构造方法

 

class A(B,C):

def __init__(self):

B.__init__(self)

C.__init__(self)

D.__init__(self)

def bar(self):

print 'A.bar'

learn to fail, failure to learn

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程