Python学习之单继承与多继承
- 继承
面向对象编程语言的一个主要功能就是“继承”。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
(1) 单继承:python同时支持类的继承。如果一种语言不支持继承,类就没什么意义。
类还允许派生,即用户可以创建一个子类,它也是类,而且继承父类(即基类)的所有特征和属性。
创建派生类的语法格式为:
class DerivedClassName(BaseClassName):
<statement-1>
...
<statement-N>
基类名BaseClassName必须与派生类定义在一个作用域内。除了用类名,还可以用表达式。
例如:单继承举例:
class people:
#定义基本属性
name=''
age=0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight=0
#定义构造方法
def __init__(self,n,a,w):
self.name=n
self.age=a
self.__weight=w
def speak(self):
print("%s says:I am %d years old"%(self.name,self.age))
#单继承
class student(people):
grade=''
#调用父类的构造函数
def __init__(self,n,a,w,g):
people.__init__(self,n,a,w) #student继承并使用people的__init__函数
self.grade=g #不同于people的参数g
#重写父类的方法
def speak(self):
#显示student的信息
print("%s says:I am %d years old,I am in Grade %d."%(self.name,self.age,self.grade))
s=student('Tom',10,90,3) #实例化student类
s.speak() #显示student的speak方法
#运行结果:Tom says:I am 10 years old,I am in Grade 3.
(2) 多继承:某个类继承了多个父类
多继承的类定义语法格式如下:
class DerivedClassName(Base1,Base2,Base3):
<statement-1>
...
<statament-N>
#注意解析类属性的规则是,顺序是深度优先,从左到右。因此,如果在DerivedClassName(示例中的派生类)中没有找到这个属性,就会搜索Base1,然后递归的搜索其基类,如果最终没有找到,就搜索Base2,依次类推。深度优先不区分属性继承自基类还是直接定义。
例如:class people:
#定义基本属性
name=''
age=0
__weight=0
#定义构造方法
def __init__(self,n,a,w):
self.name=n
self.age=a
self.__weight=w
def speak(self):
print("%s says:I am %d years old"%(self.name,self.age))
#单继承
class student(people):
grade=''
#调用父类的构造函数
def __init__(self,n,a,w,g):
people.__init__(self,n,a,w) #student继承并使用people的__init__函数
self.grade=g
def speak(self):
print("%s says:I am %d years old,I am in Grade %d."%(self.name,self.age,self.grade))
class speaker():
topic=''
name=''
def __init__(self,n,t):
self.name=n
self.topic=t
def speak(self):
print("I am %s,I am a speaker,my topic is %s"%(self.name,self.topic))
class sample(speaker,student):
a=''
def __init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)
test_1=sample("Tom",12,90,3,"One World One Dream")
test_1.speak()
#执行结果:I am Tom,I am a speaker,my topic is one World One Dream.
(3) 补充:
1.方法重写
如果父类方法的功能不能满足需求,可以在子类里重写父类的方法。
例如:
class Parent: #定义父类
def myMethod(self):
print('调用父类方法')
class Child(Parent): #定义子类
def myMethod(self):
print('调用子类方法')
Child_1=Child() #子类实例
Child_1.myMethod() #子类调用重写方法
输出:调用子类方法
2. if__name__=’__main__’的作用
这条语句的意思是,让程序员写的脚本模块既可以导入到别的模块中调用,也可以在模块中自己执行。
例如 #y1htext.py
def main():
print('hello world,I am in %s now.' %__name__)
if __name__=='__main__':
main() 运行结果:hello world,I am in __main__now.
在这个文件中定义了一个main()函数,如果执行该.py文件,则if语句中的内容被执行,成功调用main()函数。
从另一个模块导入该模块,这个模块的名字是test1.py
#test1.py
from y1htext import main
mian() #相同的运行结果
3. 运算符重载:用于新类的运算符的实现。
运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造,一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。
Python支持运算符重载,它的运算符重载就是通过重写这些python内建方法来实现的。这些内建方法都是以双下划线开头和结尾的,Python通过这种特殊的命名方式来拦截操作符,以实现重载。
例如:+用__add__方法,+=用__iadd__方法,...,*用__mul__方法等
当Python的内置操作运用于类对象时,Python会去搜索并调用对象中指定的方法来完成操作。运算符重载是通过创建运算符函数实现的,运算符重载实际是一个函数,所以运算符的重载实际上是函数的重载。
例如:运算符重载
class Computation():
def __init__(self,value):
self.value=value
def __add__(self,other):
return(self.value+other.value)
def __sub__(self,other):
return(self.value-other.value)
c1=Computation(10)
c2=Computation(10)
print(c1+c2)
print(c1-c2) #“-”在作用于类对象,实现减法运算符的重载
说明:如果类实现了__add__的方法,当类的对象出现在“+”运算符中时,会调用这个方法;如果类实现了__sub__方法,当类的对象出现在“-”运算符中时,会调用这个方法。重载这两个方法就是可以在普通的类对象上添加“+”和“-”运算。
(4) isinstance函数(Python语言的一个内建函数)
语法:isinstance(object,type) 函数是Python语言的一个内建函数
作用是:判断一个对象或者变量是否是一个已知的类型。
① 针对类来说,如果参数是object是type类的实例(判断一个对象是否为该类的实例)或者object是type类的子类的一个实例,则返回True.如果object不是一个给定类型的对象,则返回结果是False.
class objA:
pass
class objB(objA):
pass
A=objA()
B=objB()
print(isinstance(A,objA))
print(isinstance(B,objA))
print(isinstance(A,objB))
print(isinstance(B,objB))
② 针对变量来说,第一个参数(object)为变量,第二个参数(type)为类型名或者由变量名组成的一个元组(如(int,list,float)),其返回值为布尔型(Ture或False).若第一个参数为一个元组,则变量类型与元组类型名之一相同时即返回True.
a=2
print(isinstance(a,int))
print(isinstance(a,str))
print(isinstance(a,(str,int,list)))
(5) super()函数
当存在继承关系的时候,有时候需要在子类中调用父类的方法。如果修改父类名称,那么在子类中会涉及多处修改。
Python引入了super()机制,语法格式如下:
super(type[,object-or-type])
例如:
class A(object):
def __init__(self):
print('enter A')
print('leave A')
class BA.: #B继承A
def __init__(self):
print("enter B")
super(B,self).__init__() #python2对其理解为:super(B,self)首先找到B的父类(就是类A),然后把类B的对象self转换为类A的对象,然后被转换的类A对象调用自己的__init__函数。Python3.x可以不加参数而直接写为super().__init__,并且可以像父类中的属性赋值。
print("leave B")
b=B()
Python学习之单继承与多继承的更多相关文章
- python学习 day23 面向对象三大特性之继承
### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...
- Python学习第十五篇——类继承和类实例化
学习Python类时,我们明白了类的本质,以及所谓的面向对象编程思想强调的对事物本身的属性,我们对某一类事物进行描述——采用了很多方法,这些方法描述了类的属性(比如猫科动物的眼睛,四肢,是否哺乳类等等 ...
- python学习小结5:封装、继承、多态
面向对象程序设计中的类有三大特性: 继承,封装,多态 继承:以普通的类为基础建立专门的类对象 封装:对外部世界隐藏对象的工作细节 多态:可对不同类的对象使用同样的操作 在Python中类的继承定义基本 ...
- python学习day19 面向对象(一)封装/多态/继承
面向对象 封装思想:将同一类的函数函数封装到同一个py文件中,方便调用 面向对象也有封装的作用,将同一类的函数封装到一个类中 多态(鸭子模型):多种类型/多种形态 #,什么事鸭子模型 对于一个函数,p ...
- 5月10日 python学习总结 单表查询 和 多表连接查询
一. 单表查询 一 语法 select distinct 查询字段1,查询字段2,... from 表名 where 分组之前的过滤条件 group by 分组依据 having 分组之后的过滤条件 ...
- python学习 day20 (3月27日)----(单继承多继承c3算法)
继承: 提高代码的重用性,减少了代码的冗余 这两个写法是一样的 Wa('青蛙').walk() #青蛙 can walk wa = Wa('青蛙') wa.walk() #青蛙 can walk 1. ...
- python基础学习笔记——单继承
1.为什么要有类的继承性?(继承性的好处)继承性的好处:①减少了代码的冗余,提供了代码的复用性②提高了程序的扩展性 ③(类与类之间产生了联系)为多态的使用提供了前提2.类继承性的格式:单继承和多继承# ...
- python学习第十六天 --继承进阶篇
这一章节主要讲解面向对象高级编程->继承进阶篇,包括类多继承介绍和继承经典类和新式类属性的查找顺序不同之处. 多继承 上一章节我们讲到继承,子类继承父类,可以拥有父类的属性和方法,也可以进行扩展 ...
- python学习日记(面向对象——继承)
什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class Par ...
随机推荐
- USACO Training3.3 A Game【区间Dp】 By cellur925
题目传送门 一股浓浓的博弈论香气...然而本蒟并不会博弈论. 开始用双端队列+假的dp水过了24pts水数据. 其实是布星的,两人都绝顶聪明会深谋远虑不像我只看眼前,所以上述算法错误. 正解:区间dp ...
- (转载)Python一篇学会多线程
Python 一篇学会多线程 链接:https://www.cnblogs.com/yeayee/p/4952022.html 多线程和多进程是什么自行google补脑,廖雪峰官网也有,但是不够简洁 ...
- 简单的AndroidStudio单元测试工程配置
转载: http://www.jianshu.com/p/03118c11c199
- [BZOJ2056]gift? 高精度?
Description Input 输入的第一行为一个整数t. 接下来t行,每行包含九个自然数. Output 输出t行 每行一个整数,表示\(2^a+2^b+2^c+2^d+2^e+2^f+2^g+ ...
- _bzoj1497 [NOI2006]最大获利【最大权闭合子图】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1497 保存最大流模版. 选一个用户群,就必须要选对应的两个中转站,这种关系类似“最大全闭合子 ...
- CentOS安装GlassFish4.0 配置JDBC连接MySQL
转自:http://linux.it.net.cn/CentOS/course/2014/0724/3319.html 版本glassfish-4.0.zip 1.解压,拷贝到指定安装路径 unz ...
- Objective-c单例模式的正确写法--用dispatch 线程安全
单例模式在iOS开发中可能算是最常用的模式之一了,但是由于oc本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦,这里我就抛砖引玉来聊一聊iOS中单例模式的设计思路.关于单例模式更多的介绍请参考 ...
- OpenCV2.4.9 + Ubuntu15.04配置
为了run Car-Detection安装了OpenCV. 基本上就照着这个弄下来: ubuntu14.04 + OpenCV2.4.9 配置方法 1. 安装openCV 所需依赖库或软件: s ...
- @ComponentScan、@EnableFeignClients和@MapperScan注解笔记
@ComponentScan:此注解是用来管理容器中的bean,即是管理项目中类的依赖关系, 注意此注解并不创建类的实例: 默认情况下此注解扫描本工程下的所有包, ...
- 使用nginx搭建简单文件服务器
最近再做一个博客,本想使用fastdfs标准的文件存储服务器,但考虑到资源占用问题,且使用nginx比较快速,且效果不差.于是采用ngixn搭建. nginx搭建文件服务器,本质上就是nginx的静态 ...