Python 中的面向对象和异常处理
在之前我们已经说过了 Python 中内置的主要的几种对象类型,(数,字符串,列表,元组和字典)。而面向对象的核心人物还没出场呢 。那么我们常说的对象是什么类型的呢,其实他的类型就是“类”。继承封装和多态,这是通用的面向对象编程的思想 。
继承是为了提高代码的复用性,子类可以通过继承父类来实现父类中的方法,这就是光明正大的偷懒 。举例:
class Person():
def eat(self):
print("person can eat ...")
def slepp(self):
print("person can slepp ...") calss Man(Person):
def hardWork(self):
print("man should be work hard ...") # 测试
m = Man()
m.eat()
# person can eat ...
以上一个例子,说明了很多问题,首先,定义类是使用class
关键字,定义方法使用def
,默认传入一个参数,其实这个参数不一定非要叫self
但是为了辨识性,我们这样定义,因为它代表的就是当前对象,类似 Java 中的 this 。当然还有我们的继承是通过一个括号+父类来定义的,那为什么Person没有写呢,其实这里省略了一个object
不写就表示默认继承 object
超类 。另外,Python 支持多继承,像这样即可,calss Man(Animal,Person)
一个问题需要注意,当多个父类中含有同一个方法时,以后面的为准 。但是,强烈不推荐大家使用多继承 。
封装,理解起来很简单,就是将类中的属性信息隐藏起来,提供公共的方法以备调用,我们将属性进行 ” 私有化 “,在属性的前面加上两个下划线 __name
定义一个假的私有的属性 。看例子:
class Man(): def __init(self): # 这是对象的初始化方法,创建对象是默认执行
self.__name = '' def set_name(self,name):
self.__name = name
def get_name(self):
return self.__name m = Man() # 创建对象
m.set_name('YJK923') # 设置 name 值 ( 其实是 _Man__name )
m.get_name() # 获取 name 值 ( 其实是 _Man__name )
'YJK923'
m.name = 'YJK' #注意这里是另外添加了一个属性 name
m.get_name() # 获取 name 值 ( 其实是 _Man__name )
'YJK923'
m.name # 获取的是刚刚为 m 创建的 name 的值
'YJK'
m._Man__name # 获取属性 _Man__name ,这就是 Python 猫腻的地方,其实并没有私有化,只是转化格式了 。
'YJK923'
还有就是多态了,简单理解,就是有多种状态,常见的就是同一个方法但是执行的效果却不一样,就像是同一个名字人有太多了,而每个人却又不一样,看吧,编程思想也都是来自于日常的生活 。举例吧 ,都是睡觉 ,但是有的人喜欢躺在床上,有的人喜欢睡在椅子上 。用代码怎么实现呢 ?看下面
class People():
def sleep(self):
print("人睡觉 。。。") class Roommate(People):
def sleep(self):
print('睡在椅子上 。。。')
看吧,同样是睡觉,Roommate 却是睡在椅子上,通过继承的方式实现多态只是实现多态的一种方式而已 。还可以通过其它的方式,比方说这样,方法的参数是超类。
# 不同的对象调用同样的方法,结果却一样 。
fun(obj):
print( obj.__len__() )
附加说几个比方常用的方法
# 标准模块 random 中包含一个名为 choice 的函数,用于从序列中水机选择一个元素。
from random import choice
x = choice(['Hello,world !',[1,2,'e','e',4]])
x.count('e')
2 # 随机生成的,也可能不是 2 # 判断类 A 是不是 B 的子类
issubclass(A,B) # 儿子在前,老子在后 # 查找类 A 的所有父类
A.__bases__ # 查找一个对象 A 中的所有属性
A.__dict__ # 查找对象 A 属于哪一个类
A.__class__ # 检查方法或属性是否存在与对象中
hasattr(instance,'methedName | attrName') # 设置对象的属性
setattr(instance,'attrName',value')
关于抽象类:定义了一种规则(抽象方法),继承这个类的子类必须实现抽象类中的抽象方法 。而且,抽象类是不能被实例化的 。
Python 中引入了 abc
模块来实现抽象类的定义,示例:
# 下面表示定义了一个 抽象类 Talker , 包含一个抽象方法 talk . from abc import ABC,abstractmethod class Talker(ABC):
@abstractmethod
def talk(self):
pass
插播一曲关于面向对象设计的一些思考 。
- 将相关的东西放在一起,如果一个方法要使用全局变量,那就将他作为类的属性和方法
- 不要让对象之间过于亲密 。这就是所谓的解耦和吧 。
- 慎用继承,尤其是多重继承 。
- 保持简单,让方法尽可能的短小精悍 。
如何将需求转化为具体的实体类呢 ? 我们可以尝试这样做 。
将需求描述出来记录其中的名词,动词和形容词。
在名词中找出可能的类,
在动词中找出可能的方法,
在形容词中找出可能的属性,
最后将找出的方法和属性分配给各个类。
这样类的模型就出来了,然后我们可以思考对象之间的关系,继承或是组合。
后面再思考一下对应业务有哪些可以使用的模式,待各个业务模块都思考清楚后就可以着手编程了 。
下面简单的说一下 Python 中的异常处理机制 。
抛出异常使用关键字 raise
例如,raise Exception('exception msg !')
但是需要注意的是异常的抛出只能是 Exception 或 Exception 的子类 。
捕获异常:我们可以使用try ... except : ... finally: ...
语句块来处理可能出现异常的代码 。
try
1 / 0
except ZeroDivisionError as e:
print(e)
else :
print('No exception will run ...')
finally :
print('must be run ... ')
自定义异常类,定义一个类继承 Exception 类即可 。
class MyException(Exception):
pass
Python 中的面向对象和异常处理的更多相关文章
- 22.python中的面向对象和类的基本语法
当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个 ...
- 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)
面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...
- python语言(七)面向对象、异常处理
一.异常处理 python解释器检测到错误,触发异常(也允许程序员自己触发异常).程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关).如果捕捉成功则进入另外一个处理分 ...
- python中的面向对象编程
在python中几乎可以完成C++里所有面向对象编程的元素. 继承:python支持多继承: class Derived(base1, base2, base3): pass 多态:python中的所 ...
- 2019-04-15 Python中的面向对象学习总结
一.面向对象总结: (1)三要素:封装,继承,多态 详细介绍链接:https://www.jianshu.com/p/68a ...
- 第四章 python中的面向对象设计
一.首先来理解几个面向对象的关键特性: 1.封装:对象可以将他们的内部状态隐藏起来.python中所有特性都是公开可用的. 2.继承:一个类可以是一个或多个类的子类.python支持多重继承,使用时需 ...
- python中的面向对象和面向过程
一.面向对象和面向过程 一.什么是面向过程 核心是过程二字:面向过程是一种流水线的工作流程,是先做什么在做什么 二.什么是面向对象 核心 是对象二字:是一种编程思想,上帝思维,一切皆对象,编程中负责调 ...
- Python 中的面向对象编程
面向对象编程(Object-oriented programming, OOP)是一种基于对象概念的编程范式,可包含属性(attribute)形式的数据以及方法(method)形式的代码.另一种对 O ...
- python学习之【第十七篇】:Python中的面向对象(类和对象)
1.什么是类和类的对象? 类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起,类是现实世界的抽象的实体以编程形式出现.实例是这些对象的具体化.类是用来描述一类事物,类的对象指的 ...
随机推荐
- python核心编程笔记——Chapter6
Chapter 6.序列:字符串,列表和元组 这章内容比较多啊,看得比较久,而且题目又难很多. 6.1鉴定一个字符串是否是另外一个字符串的字串,这道题目不是很确定,好像没有直接的判定吧. 直接是否内建 ...
- 假·最大子段和 (sdutoj 4359 首尾相连)(思维)
题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2736/pid/4359 具体思 ...
- Python [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed 解决方法
一个搭建在SAE上的Django应用,使用新浪微博提供的Python SDK已经稳定运行一年有余,但最近开始持续出现微博认证失败的状况. 摘录微博python SDK的错误提示如下所示: ERROR: ...
- maxout激活函数
maxout的拟合能力是非常强的,它可以拟合任意的的凸函数.最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合(学过高等数学应该能明白),而maxout又是取k个隐隐含层节点的最大值,这些 ...
- pom.xml一个简单配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- elasticsearch学习笔记--原理介绍
前言:上一篇中我们对ES有了一个比较大概的概念,知道它是什么,干什么用的,今天给大家主要讲一下他的工作原理 介绍:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户 ...
- Centos中查询目录中内容命名ls
首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录, #代表用户权限 #表示超级用户,$表示普通用户: 查询目录中内容命令 ls (list缩写) ...
- ubuntu和windows双系统启动顺序的修改
ubuntu和windows双系统启动顺序的修改 说到启动就不得不说GRUB,Linux下大名鼎鼎的启动管理工具(曾经的LILO已经风光不再),当然现在已经是GRUB2了,GRUB2和GRUB最重要的 ...
- return to dl_resolve无需leak内存实现利用
之前在drop看过一篇文章,是西电的Bigtang师傅写的,这里来学习一下姿势做一些笔记. 0x01 基础知识 Linux ELF文件存在两个很重要的表,一个是got表(.got.plt)一个是plt ...
- 超简单的java爬虫
最简单的爬虫,不需要设定代理服务器,不需要设定cookie,不需要http连接池,使用httpget方法,只是为了获取html代码... 好吧,满足这个要求的爬虫应该是最基本的爬虫了.当然这也是做复杂 ...