【Python基础】Python 面向对象编程(下篇)
已完成专题
1我的施工计划
2数字专题
3字符串专题
4列表专题
5流程控制专题
6编程风格专题
7函数使用
8.面向对象编程(上篇)
上一篇面向对象编程(上篇)讨论了面向对象编程的基础部分,使用案例讲解了三大特性:封装、继承、多态。
今天继续讨论面向对象编程的进阶部分
进阶专题
1 创建抽象方法
上篇讲解多态部分,定义了基类模块animals2.py
,它里面有一个方法getSpeedBehavior
,然后2个继承类中分别重写了此方法。虽然这种模式并不会报错,但却不是最佳编程写法。
class Animal():cprop = "我是类上的属性cprop"def __init__(self,name,speed):self.name = name # 动物名字self._speed = speed # 动物行走或飞行速度def __str__(self):return '''Animal({0.name},{0._speed}) is printedname={0.name}speed={0._speed}'''.format(self)def getSpeedBehavior(self):pass
更加优秀的做法,显示的定义基类的此方法为抽象方法,并且明确指名这两个继承类需要重写此方法。
借助Python内置的abc
模块,使用abstractmethod装饰器,Animal类的改进版:
import abcclass Animal():cprop = "我是类上的属性cprop"def __init__(self,name,speed):self.name = name # 动物名字self._speed = speed # 动物行走或飞行速度def __str__(self):return '''Animal({0.name},{0._speed}) is printedname={0.name}speed={0._speed}'''.format(self)# 使用abstractmethod装饰器后,变为抽象方法@abc.abstractmethoddef getSpeedBehavior(self):pass
其他类都不改变。以上就是创建抽象类的方法。
2 检查属性取值
已经在Animal类中定义2个属性name和_speed:
class Animal():cprop = "我是类上的属性cprop"def __init__(self,name,speed):self.name = name # 动物名字self._speed = speed # 动物行走或飞行速度
像这种方法定义的属性,外界可以对属性赋任意值,这不是合理的。如下speed参数被赋值为负值,这肯定不合理:
jiafeimao = Cat('jiafeimao',-2,'gray','CatGenre')
所以一种解决方法便是使用@property,写法也很简洁:
# 读@property def _speed(self):return self.__speed# 写@_speed.setterdef _speed(self,val):if val < 0:raise ValueError('speed value is negative')self.__speed = val
Cat('jiafeimao',-2,'gray','CatGenre')执行时,会进入到@_speed.setter,检查不满足,抛出取值异常。
@property就是给_speed函数增加功能后返回一个更强大的函数,@属性.setter
也是一个函数,装饰后控制着属性的写入操作。
3 给类添加属性
基础篇说到为实例添加属性,只对此实例生效,其他属性还是没有此属性。怎样在外面一次添加属性后,所有实例都能具有呢。
答案是为类添加属性,如下所示,为Cat类增加属性age后,jiafeimao实例 和jiqimao实例都有了age属性,且都可被修改:
if __name__ == "__main__":jiafeimao = Cat('jiafeimao',2,'gray','CatGenre')Cat.age = 1jiafeimao.age = 3print(jiafeimao.age) # 3 jiqimao = Cat('jiqimao',3,'dark','CatGenre')jiqimao.age = 5print(jiqimao.age) # 5
这就说明,一次为类添加一个属性,类的所有实例都会有这个新增的属性。
这种虽然写法便利,但是会带来副作用,支持动态添加实际上破坏了类的封装性,为维护程序带来不便。同时,如果泛滥使用,属性过多占用内存就会变大,影响程序的性能。
4 控制随意添加属性
Python应该意识到上面动态添加属性带来的副作用,因此留出一个系统魔法函数__slots__
,以此来控制随意在外添加属性。
使用__slots__
,定义这个类只能有哪些属性,不在这个元组里的属性添加都会失败。
如下这样做后,控制Student类只能有属性name和age,不允许添加其他属性:
class Student(object):__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称def __init__(self,name,age):self.name = nameself.age = ages = Student('xiaoming',100) # 创建新的实例
s.score=10
如下异常:
5 链式调用
每个对外公开的方法,都返回self,这样在外面调用时,便能形成一条链式调用线,在pyecharts等框架中可以看到这种调用风格。
class Student(object):__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称def __init__(self,name,age):self.name = nameself.age = agedef set_name(self,val):self.name = val return self def set_age(self,age):self.age = age return selfdef print_info(self):print("name: "+self.name)print("age: "+ str(self.age))return selfs = Student('xiaoming',100) # 创建新的实例(s.set_name('xiaoming1').set_age(25).print_info()
)
关于面向对象编程的进阶部分,还有一个重要的设计原则:MixIn 原则,这个我们放到后面在讲设计模式时一起讨论。
以上就是面向对象编程的进阶部分,原创不易,欢迎三连支持。
往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/662nyZF本站qq群1003271085。加入微信群请扫码进群(如果是博士或者准备读博士请说明):
【Python基础】Python 面向对象编程(下篇)相关推荐
- python基础之面向对象编程
python基础之面向对象编程 面向对象编程思想 面向对象是一门编程思想,编程思想仅仅是一门思想,与任何技术无关 核心是对象两字,对象可以理解为特征与技能的结合体 基于该编程思想编写程序,就好比创造世 ...
- 带你学python基础:面向对象编程
面向对象编程是个啥呢,其实,在传统的语言中,比如 C 语言,是不存在面向对象编程这个概念的,那时候的语言只有面向过程编程,也就是我们写代码从头写到底,最多也就是有函数.所以,这样的代码风格是比较难维护 ...
- Python基础课程-面向对象编程
Python面向对象编程 在本文中,您将学习Python中的OOP的以下基本概念: Python类 对象实例 定义和使用方法 OOP继承 什么是面向对象编程(OOP)? 面向对象编程(Object-o ...
- Day7 - Python基础7 面向对象编程进阶 --转自金角大王
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...
- python面向对象编程的优点-Python 基础知识----面向对象编程
一.面向对象编程介绍 面向过程编程: 核心是过程二字,过程指的是解决问题的步骤,即先做什么再干什么然后干什么. 基于该思想编写程序好比在设计一条流水线,是一种机械式的思维方式. 优点:复杂的问题流程化 ...
- Python基础学习——面向对象编程(第一讲:面向对象概述、面向对象三个基本特征(封装性、继承性、多态性)、类和对象(定义类、创建和使用对象、实例变量、类变量、构造方法、实例方法、类方法、静态方法))
面向对象是Python最重要的特性,在Python中一切数据类型都是面向对象的. 1.面向对象概述 面向对象的编程思想是,按照真实世界客观事物的自然规律进行分析,客观世界中存在什么样的实体,构建软件系 ...
- Day6 - Python基础6 面向对象编程 --转自金角大王
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你 ...
- Python基础——6面向对象编程
类和实例 类是抽象的模版,例如汽车:而实例则是拥有相同方法的类的实现,例如汽车里面有大众.宝马.奔驰等等,这些车都能在地面上跑,但是它们的具体数据可以不一样. calss Student(object ...
- Python基础:面向对象编程实战——简易图书管理系统
简易图书管理系统主要有以下功能:1.查询所有书籍2.添加书籍3.借阅书籍4.归还书籍5.退出系统.代码实现主要为: class Book:def __init__(self, name, author ...
- 第二章(1):Python入门:语法基础、面向对象编程和常用库介绍
第二章(1):Python入门:语法基础.面向对象编程和常用库介绍 目录 第二章(1):Python入门:语法基础.面向对象编程和常用库介绍 1. Python 简介 1.1 Python 是什么? ...
最新文章
- oracle 修改用户密码_干货!数据库安全之Oracle数据库安全加固
- python与excel的区别-python比较两个excel表格的差异
- Shell中的${ }、#、##、%、%%使用范例
- html table导出到Excel中,不走后台,js完成
- linux 信号处理函数详解
- 解决file.seek()读取文件报错:AttributeError: ‘str‘ object has no attribute ‘seek‘
- Springboot+Dubbo+Nacos 注解方式实现微服务调用
- 华为手表表盘的数字什么意思_知识 手表防水是什么意思?
- 在python中sqrt是什么意思_python中sqrt是什么意思
- leetcode934.ShortestBridge
- 并发之AtomicIntegerFieldUpdater
- 【TWVRP】基于matlab蚁群算法求解带时间窗的多中心车辆路径规划问题【含Matlab源码 112期】
- 在线浏览 Stata 15 PDF 全套电子手册
- 福建高中计算机会考知识点,福建省高中信息技术会考《信息技术基础》复习提纲.doc...
- python如何获取excel数据_python如何读取excel表数据
- opensim源码安装教程
- 第三阶段应用层——1.13 数码相册—梳理与总结
- Linux 上通过 Rhythmbox 听音乐
- dubbo 报错 com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:408)
- oracle灾备同步_【oracle灾备方案系列】基于DDS的Oracle复制容灾方案(三)
热门文章
- Oracle表空间规划处理
- 多对多关联查询sql语句
- python 删除非空文件夹
- [2018/11/14] 学习的思考
- Jquery插件(一) webupload上传插件
- 串口调试助手-打开报错
- poj1426(dfs)
- Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别...
- jquery easyUi简单介绍
- java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组