python面向对象之继承
Posted 杨立果
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python面向对象之继承相关的知识,希望对你有一定的参考价值。
继承
介绍
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。继承即常说的is-a关系。子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为。
例子:
比如可以先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
继承所表达的就是一种对象类之间的相交关系,它使得某类对象可以继承另外一类对象的数据成员和成员方法。若类B继承类A,则属于B的对象便具有类A的全部或部分性质(数据属性)和功能(操作),我们称被继承的类A为基类、父类或超类,而称继承类B为A的派生类或子类。
表示父类和子类的术语:父类和子类、超类和子类、基类和派生类,他们表示的是同一个意思。
为什么需要继承
开发动物类,其中动物分别为企鹅以及老鼠,要求如下:
企鹅:属性(姓名,id),方法(吃,睡,自我介绍)
老鼠:属性(姓名,id),方法(吃,睡,自我介绍)
企鹅和老鼠都是动物我们是不是可以写一个动物类,这样代码是不是简洁了许多。有的人说我就想单独建两个类写这个属性,我只能告诉你可以,但这好比,你父亲给你了几百万,你偏不要,把这些钱扔了非要自己去挣,你想这样我也没办法。既然java给我们提供了继承我们就要好好用这样会大大提高我们的开发效率,比如:维护性提高了,代码也更加简洁,提高代码的复用性也提高了(复用性指可以多次使用,不用再多次写同样的代码)。
作用:
1、继承可以减少重复的代码。比如父类已经提供的方法,子类可以直接使用,不必再去实现。
2、继承是多态性的前提。当然使用继承的同时也提高了类的耦合度。
当你不需要父类的属性时,可以覆盖调原属性。
python继承
继承分为多继承和单继承,而python就属于多继承。python也和java有些区别,在这里也说一下
特点:
? 1:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的,新式类的基类默认是有object的,同时基类右多个的话就为多继承
? 2:在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于java,java是自动调用初始化方法的。
3:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
4:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
初始化
第一种方法:基类名.__init__(self,arg)
class A(object): # 新式类
"""基类"""
def __init__(self, name, age):
# super(A, self).__init__()
self.name = name
self.age = age
class B(object):
"""基类"""
def __init__(self, height):
self.height=height
class C(A):
"""继承一个,单继承"""
def __init__(self, name, age, sex):
A.__init__(self, name, age) #第一种方法
self.sex = sex
class D(A,B):
"""继承一个,单继承"""
def __init__(self, name, age, sex,height):
A.__init__(self, name, age) #第一种方法
B.__init__(self, height)
self.sex = sex
第二种方法:supper关键字 即 supper(obj,self).__init__(arg)
class A(object): # 新式类
"""基类"""
def __init__(self, name, age):
super(A, self).__init__()
self.name = name
self.age = age
class B(object):
"""基类"""
def __init__(self, height):
self.height=height
class C(A):
"""继承一个,单继承"""
def __init__(self, name, age, sex):
super(C, self).__init__(name, age) #第二种方法
self.sex = sex
class D(A,B):
"""继承一个,单继承"""
def __init__(self, name, age, sex,height):
super(D, self).__init__(name, age) #第二种方法
# 使用此方法只能初始化第一个基类,第二个基类如果有不一样的参数就无法初始化,建议使用第一种
self.sex = sex
注:单继承时推荐第二种,多继承时使用第一种
多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。java的多继承是通过实现多个接口实现的。
isinstance(a,b)
可以判断判断一个变量的类型,可以用来判断a是否为b的实例对象,返回True或False
type()
函数获取变量的类型,返回变量的类型
以上是关于python面向对象之继承的主要内容,如果未能解决你的问题,请参考以下文章