Python核心技术与实战——九|面向对象
在搞清了各种数据类型、赋值判断、循环以后如果是从C++、Java语言入手的,就会有一个深坑要过:OOP(object oriented programming):公私有保护、多重继承、多态派生、纯函数、抽象类、友元函数等等等等一堆专有名词等着你呢!还好还好!Python是一门相对友好一点的语言,他在创立之初就鼓励命令交互式的轻量级编程。理论上,Python的命令式语言是图灵完备的,也就是说命令式语言,理论上可以左到任何其他任何语言能做到的所有事情,甚至进一步,仅仅以靠汇编语言的MOV指令,就能实现图灵完备编程。
那为什么我们不这么做呢?事实上“上古时代”的程序员就是这么做的,可随着程序功能性复杂的逐步提升,需求的不断迭代,很多老旧的代码修改起来就无比麻烦,根本无法迭代和维护,甚至只能重构。这也就是为什么古老的代码称为“屎山”的原因。
传统的命令式语言有无数重复性的代码,虽然函数的诞生减少了很多重复的代码。但随着计算机的发展,只有函数是不够的,要把更加抽象的概念引入计算机才能缓解(注意是缓解而不是解决),这样OOP就应运而生。
一.基础概念
面向对象的基础概念在Python篇面向对象编程和Python面向对象进阶使用总结过,这里就不再多说了,总之就是这四个点,虽然总结的互式很严谨,但也可以直观的了解一下:
1.类:一群有着相似性的事物的集合,在Python里对应的是class;
2.对象:集合中的一个失误,Python里对应由class生成的某一个object;
3.属性:对象的某个静态特征;
4.函数:对象的某个动态能力。
二.几种非常规:类函数、静态函数等
有几种函数我们再巩固一下:
class Peaple():
NATIONALITY = 'China' #常量/类变量
def __init__(self,name,sex,age,salary=1000): #构造函数
self.name = name
self.sex = sex
self.age = age
self.__salary = salary #私有属性 @classmethod #类方法,不能调用实例属性,只能调用类变量
def fun(self):
print(self.NATIONALITY) @staticmethod #静态方法,声明时不会把self传递给函数
def fun2(test):
print(test) p1 = Peaple('Jack','male',22)
p1.fun()
这个例子里,就列举了常用的几个方法和属性(习惯问题,有些时候叫方法,也有时候叫函数):
1.类变量/常量:比如这个类里的对象都具有的属性,我们在抽象类的时候就可以把他拿出来,在实例化的时候就不用再专门赋值了。一般类变量都是用大写字母来命名。
2.类方法:用装饰器将方法声明为类方法,在函数内无法调用在构造函数中定义的属性,只能调用上一条中的类属性。类属性还有另外一种用法,返回一个类:
@classmethod
def new_person(cls,name,sex,age):
return cls(name=name,sex=sex,age=age)
p1 = Peaple('Jack','male',22)
p2 = p1.new_person('Mary','female',25)
我们定义个类方法,然后可以通过实例调用这个类方法创建一个新的实例(还没想到有什么实际作用)
3.静态方法:静态方法已经和类没什么关联了,只是在调用的时候要加上类。最直观的例子就是类似于os的模块,导入后os里的各个方法其实和os这个类是没什么关系的,但是在调用的时候还是要加上os
import os
os.open()
os.close()
4.私有属性是只有在类里的方法可以调用的,而在实例中无法调用。(同样,在定义方法的时候加上"__"注意是两道下划线就构成了私有方法,也是只能在构造类里使用,在实例中无法使用)。
三.继承
继承是面向对象里很重要的一点,说白了就是子类具有费雷的属性和函数。在下面一章结合实例应用里面我们会着重提一下,在这里就说几点:
1.子类在实例化的时候是不会调用父类的构造函数的,必须显性的调用父类的构造函数,(super().__init__())。
2.其次,在某些定义的类的方法时候
class A():
def __init__(self):
pass def fun(self):
raise Exception('fun is not defined')
在父类定义fun的时候,这种方式定义出来的函数,在子类里必须重构一下,否则会raise error中断程序的执行,这种写法叫函数重写,可以使子类必须重新写一遍函数来盖掉原来的函数。
3.还有一种类是抽象类,它的存在就是作为父类存在的,一旦对象化就会报错(就像PyQt5里的各种基类),
from abc import ABCMeta,abstractclassmethod
class A(metaclass=ABCMeta): def __init__(self):
pass @abstractclassmethod
def fun(self):
raise Exception('fun is not defined')
在这里A就是一个抽象类。抽象类里可以把所有子类的共同的方法都放进去,但是A类是不能直接实例化的。
这是软件功能中一个很重要的概念:定义接口。大型工程往往需要很多人合作开发,在idea提出后,开发组和产品组首先召开产品设计会,PM写出产品需求文档,然后迭代;TL(项目经理)编写开发文档,开发文档中会定义不同模块的大致功能和接口、每个模块之间如何写作】单元测试和继承测试、线上灰度测试、监测和日志等等一些列开发流程。抽象类就是这么一种存在,他是一种自上而下的设计风范,只需要少量的代码描述清除要做的事情,定义好接口,然后就可以交给不同的开发人员去开发和对接。
4.注意继承的顺序:在以前那个帖子里演示过了,总结了就是一句:在Python2中经典类是按照深度优先来继承,新式类是广度优先的继承策略;而在Python3中经典类和新式类都是按照广度优先的继承策略。
Python核心技术与实战——九|面向对象的更多相关文章
- Python核心技术与实战——十|面向对象的案例分析
今天通过面向对象来对照一个案例分析一下,主要模拟敏捷开发过程中的迭代开发流程,巩固面向对象的程序设计思想. 我们从一个最简单的搜索做起,一步步的对其进行优化,首先我们要知道一个搜索引擎的构造:搜索器. ...
- Python核心技术与实战——十九|一起看看Python全局解释器锁GIL
我们在前面的几节课里讲了Python的并发编程的特性,也了解了多线程编程.事实上,Python的多线程有一个非常重要的话题——GIL(Global Interpreter Lock).我们今天就来讲一 ...
- Python核心技术与实战——六|异常处理
和其他语言一样,Python中的异常处理是很重要的机制和代码规范. 一.错误与异常 通常来说程序中的错误分为两种,一种是语法错误,另一种是异常.首先要了解错误和异常的区别和联系. 语法错误比较容易理解 ...
- Python核心技术与实战 笔记
基础篇 Jupyter Notebook 优点 整合所有的资源 交互性编程体验 零成本重现结果 实践站点 Jupyter 官方 Google Research 提供的 Colab 环境 安装 运行 列 ...
- Python核心技术与实战——十六|Python协程
我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程.那什么是协程呢? 协程 协程是实现并发编程的一种方式.提到并发,肯很多人都会想到多线程/多 ...
- Python核心技术与实战——二一|巧用上下文管理器和with语句精简代码
我们在Python中对于with的语句应该是不陌生的,特别是在文件的输入输出操作中,那在具体的使用过程中,是有什么引伸的含义呢?与之密切相关的上下文管理器(context manager)又是什么呢? ...
- Python核心技术与实战——二十|assert的合理利用
我们平时在看代码的时候,或多或少会看到过assert的存在,并且在有些code review也可以通过增加assert来使代码更加健壮.但是即便如此,assert还是很容易被人忽略,可是这个很不起眼的 ...
- Python核心技术与实战——二十|Python的垃圾回收机制
今天要讲的是Python的垃圾回收机制 众所周知,我们现在的计算机都是图灵架构.图灵架构的本质,就是一条无限长的纸带,对应着我们的存储器.随着寄存器.异失性存储器(内存)和永久性存储器(硬盘)的出现, ...
- Python核心技术与实战——十八|Python并发编程之Asyncio
我们在上一章学习了Python并发编程的一种实现方法——多线程.今天,我们趁热打铁,看看Python并发编程的另一种实现方式——Asyncio.和前面协程的那章不太一样,这节课我们更加注重原理的理解. ...
随机推荐
- loj#6034 「雅礼集训 2017 Day2」线段游戏
分析 区间李超树板子题 代码 #include<bits/stdc++.h> using namespace std; #define db double const int inf = ...
- Linux_指令杂烩
目录 目录 指令集合 常用于脚本的指令 查看变量的指令 监控命令 除了root用户的其他用户不能login 重定向 grep 过滤文件内容 vim预设定 系统在启动时要依次运行4个脚本 归档压缩文件互 ...
- div动画旋转效果
animation: spin 10s linear infinite;
- Charles抓包过滤的四种方式
日常测试中,经常要抓包看请求的request,response是不是传的对,返回的字段值对不对,众多的请求中如何找到自己想要的请求,就需要过滤请求,Charles有4种过滤方式,用那一种都可以,看个人 ...
- 20191110 Spring Boot官方文档学习(4.2)
4.2.外部化配置 Spring Boot使您可以外部化配置,以便可以在不同环境中使用相同的应用程序代码.您可以使用Properties文件,YAML文件,环境变量和命令行参数来外部化配置.属性值可以 ...
- 二、Zabbix-zabbix server部署-LNMP
部署Zabbix server主要分为两部分(软件基本都是yum安装,不要问我为什么不用源码,因为没有必须用源码的需求) 一.部署LNMP/LAMP环境,已提供zabbix的界面展示,已经zabbix ...
- Python--笔试题
一.如何提高Python的运行效率: 1.使用生成器,因为可以节约大量内存 2.循环代码优化,避免过多重复代码的执行 3.核心模块用Cython PyPy等,提高效率 4.多进程.多线程.协程 5.多 ...
- java基础笔记(7)
Socket编程 通信基础:ip地址(位置).协议(语言).端口(软件程序): java提供网络功能的四大类: InetAddress没有构造函数,不够里面有一些方法是可以返回实例,如: InetAd ...
- C语言黑与白问题
问题描述: 有A.B.C.D.E这5个人,每个人额头上都帖了一张黑或白的纸.5人对坐,每 个人都可以看到其他人额头上纸的颜色.5人相互观察后: A说:“我看见有3人额头上贴的是白纸,1人额头上贴的是黑 ...
- 洛谷 P2196 挖地雷 & [NOIP1996提高组](搜索,记录路径)
传送门 解题思路 就是暴力!!! 没什么好说的,总之,就是枚举每一个起点,然后暴力算一遍以这个点为起点的所有路径,在算的过程中,只要比目前找到的答案更优,就有可能是最后的答案,于是就把路径更新一遍,保 ...