python的继承多态以及异常处理
1.单继承
# 动物类
class Animal(object): def __init__(self, name):
self. __name = name def run(self):
print("%s 喜欢跑步" % self.__name) def sleep(self):
print("%s 喜欢睡觉" % self.__name) def getName(self):
return self.__name # 猫类
class Cat(Animal): def __init__(self, name, type):
# 调用父类构造
# 采用super
super(Cat, self).__init__(name)
# 采用超类
# Cat.__init__(name) self.type = type def bark(self):
print("%s 喜欢叫" % self.getName()) # 大黄猫
class BigYellowCat(Cat): def __init__(self, name):
# super()可以查找父类以及父类的父类的方法,但是构造访问上一个父类
# super(A,self),表示查找A类的父类以及父类的父类方法
super(Cat, self).__init__(name)
self.color = "黄" def __str__(self):
return ("%s 是一只大%s 猫" % (self.getName(), self.color)) cat = BigYellowCat("TOM") print(cat)
cat.run()
cat.sleep()
cat.bark()
单继承,只需要在创建类是增加()添加继承的类名,即class A(B):....
上面可以看到,Cat类继承了Animal类,那么将获取Animal中所有公有的属性和方法,私有的属性和方法不继承
在创建对象时会默认调用构造方法,在继承中只会调用当前类的构造方法,有些属性定义在父类中,那么如何进行初始化呢?
这里采用两种方法,一种是采用超类,即类名.__init__(),但这里不推荐,这种格式一般是用来访问类属性的,
第二种方式是采用super(),通过super就能访问父类的所有方法,如果其父类有重写了父类的父类方法,那么会优先访问父类方法
当然需要定位访问某一个父类的方法,需要采用super(A, self),表示A类的父类(包括其父类的父类)
2.类方法和类属性
# 动物类
class Animal(object): # 定义类属性
__count = 0 # 定义类方法
@classmethod
def getCount(cls):
return cls.__count def __init__(self, name="TOM"):
self. name = name def __new__(cls, *args, **kwargs):
# 记录创建了多少个对象
cls.__count += 1
return super(Animal, cls).__new__(cls) print(Animal.getCount()) cat = Animal("猫")
dog = Animal("狗") print(Animal.getCount())
定义类属性比较简单,定义类方法需要关键字@classmethod,cls就表示当前类,与self的作用类似,调用时直接用类名.进行访问
3.静态方法
class Tool(object):
@staticmethod
def function():
print("我是静态方法!")
Tool.function()
静态方法与类本身没有任何关系,Tool类可以将它理解为将多个函数聚集在一起的工具类,通常将能够全局用的方法封装在这里
4.多继承
class Ear(object):
def getEars(self):
return " 耳朵"
def fun(self):
print("Ear")
class Nose(object):
def getNose(self):
return " 鼻子"
def fun(self):
print("Nose")
class Eyes(object):
def getEyes(self):
return " 眼睛"
def fun(self):
print("Eyes")
class Face (Nose, Eyes, Ear):
def getFace(self):
print("我有:", end="")
# 能够调用所有继承的方法
print(self.getEars() + self.getEyes() + self.getNose())
face = Face()
face.getFace()
face.fun()
多继承能够将所有父类的方法进行调用,但如果父类方法出现相同方法名时,根据继承的先后次序,优先运行最先加载的
5.多态
class Person(object):
def __init__(self, name):
self.name = name
def fun(self):
print(self.name)
class Student(Person):
def __init__(self, name, score):
super(Student, self).__init__(name)
self.score = score
def fun(self):
print("%s : %.2f分 " % (self.name, self.score))
s1 = Person("ssss")
s1.fun()
s2 = Student("xxxx", 80.2)
s2.fun()
python的多态比较简单,只是简单的涉及方法重写的问题,如需要深入了解可学习一下其他语言(如java)的多态
python的继承多态以及异常处理的更多相关文章
- python基础——继承和多态
python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...
- python面向对象之继承/多态/封装
老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...
- Python设计模式 - 基础 - 封装 & 继承 & 多态
面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...
- python 继承 多态
python 的继承 #-*- coding:utf-8 -*-class A(object): def __init__(self): print('A:我是肯定会执行的!!') def fun(s ...
- python oop常用术语 继承 多态 封装
面向对象优点 1.通过封装明确了内外 2.通过继承+多态在语言层面支持了归一化设计 抽象/实现 抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现 ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- python 面向对象之多态与绑定方法
多态与多态性 一,多态 1,多态指的是一类事物有多种形态(python里面原生多态) 1.1动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.AB ...
- python自动化开发-[第九天]-异常处理、进程
今日概要: 1.异常处理使用 2.进程 3.paramiko模块使用 一.异常处理 1.常见的错误异常 #错误异常一 print(a) #NameError #错误异常二 int('sdadsds') ...
随机推荐
- 扩展中国剩余定理 exCRT 学习笔记
前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...
- 在c#中使用sqlite3
Sqlite3是一款优秀的数据库软件,在嵌入式设备和移动端都有使用,我司现在有些项目使用的数据库是access,说实话,对这些不太感冒,我还是喜欢优雅简单的东东,于是乘着这几天休息的时间学习了下在c# ...
- 【测试的艺术】+测试分析&测试计划+模板
一.项目概述 1.1.项目背景 #就是说一下为什么要做这个项目 1.2.项目目标 #这个项目最终要达到的目标是什么 二.项目整体分析 #项目分为哪些部分?各部分之间的关联是什么?各部分的目标是什么? ...
- linux新增特性timerfd
https://blog.csdn.net/shreck66/article/details/49745149
- 在循环中使用break案例
break 表示中断,当在循环中遇到break 则结束当前整个循环,循环外面的语句. 下面的案例中,break结束的是do while循环里面的语句 class DoWhile02{ public s ...
- ubuntu 16.04 屏幕截图
shift+prtsc 快捷键截取指定区域的图片 类似qq截图
- Kafka 0.9 新消费者API
kafka诞生之初,它自带一个基于scala的生产者和消费者客户端.但是慢慢的我们认识到这些API有很多限制.比如,消费者有一个“高级”API支持分组和异常控制,但是不支持很多更复杂的应用场景:它也有 ...
- Android使用7牛云存储
第一次使用这个云存储,话说7牛云存储大有来头!区别于国内外其他云存储,七牛自行研发的全分布式架构解决了其他云存储单一数据中心架构可能存在的风险,同时首创双向加速特性对数据上传下载均加速,使得数据访问速 ...
- IE的haslayout的触发
原文连接:http://www.cnblogs.com/yunxuange/archive/2012/09/19/2693886.html layout是Windows上的IE浏览器产生许多bug的根 ...
- React.js 小书 Lesson25 - 实战分析:评论功能(四)
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson25 转载请注明出处,保留原文链接和作者信息. (本文未审核) 目前为止,第二阶段知识已经基本 ...