Python 中的面向对象和异常处理

在以前咱们已经说过了 Python 中内置的主要的几种对象类型,(数,字符串,列表,元组和字典)。而面向对象的核心人物还没出场呢 。那么咱们常说的对象是什么类型的呢,其实他的类型就是“类”。继承封装和多态,这是通用的面向对象编程的思想 。编程

继承是为了提升代码的复用性,子类能够经过继承父类来实现父类中的方法,这就是光明正大的偷懒 。举例:dom

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'

 

还有就是多态了,简单理解,就是有多种状态,常见的就是同一个方法可是执行的效果却不同,就像是同一个名字人有太多了,而每一个人却又不同,看吧,编程思想也都是来自于平常的生活 。举例吧 ,都是睡觉 ,可是有的人喜欢躺在床上,有的人喜欢睡在椅子上 。用代码怎么实现呢 ?看下面this

class People(): def sleep(self): print("人睡觉 。。。") class Roommate(People): def sleep(self): print('睡在椅子上 。。。')

 

看吧,一样是睡觉,Roommate 倒是睡在椅子上,经过继承的方式实现多态只是实现多态的一种方式而已 。还能够经过其它的方式,比方说这样,方法的参数是超类。spa

# 不一样的对象调用一样的方法,结果却同样 。
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 模块来实现抽象类的定义,示例:code

# 下面表示定义了一个 抽象类 Talker , 包含一个抽象方法 talk .

from abc import ABC,abstractmethod class Talker(ABC): @abstractmethod def talk(self): pass

 

插播一曲关于面向对象设计的一些思考 。对象

  1. 将相关的东西放在一块儿,若是一个方法要使用全局变量,那就将他做为类的属性和方法
  2. 不要让对象之间过于亲密 。这就是所谓的解耦和吧 。
  3. 慎用继承,尤为是多重继承 。
  4. 保持简单,让方法尽量的短小精悍 。
如何将需求转化为具体的实体类呢 ? 咱们能够尝试这样作 。
将需求描述出来记录其中的名词,动词和形容词。
在名词中找出可能的类,
在动词中找出可能的方法,
在形容词中找出可能的属性,
最后将找出的方法和属性分配给各个类。
这样类的模型就出来了,而后咱们能够思考对象之间的关系,继承或是组合。
后面再思考一下对应业务有哪些可使用的模式,待各个业务模块都思考清楚后就能够着手编程了 。

下面简单的说一下 Python 中的异常处理机制 。blog

抛出异常使用关键字 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
相关文章
相关标签/搜索