python中的面向对象编程
一. 类
在 Python 中,所有数据类型都可以视为对象,当然也可以自定义对象,自定义的对象数据类型就是面向对象中的类(Class)。object表示该类是从哪个类继承下来的,如果没有合适的继承类,就使用 object 类,这是所有类最终都会继承的类
1. 定义一个类
注:类名后面有括号的类,称为新式类,括号里面的内容是父类的名称;程序中所有类的父类都是 object
2. 类的数据属性
注:name,age均为类的数据属性;print Animals.name和print Animals.age为访问类的数据属性
3. 类的方法
1>类的方法 ==== 函数
2>在类中定义的函数叫做方法
3>类的方法中,python 解释器要求第一个形参必须是 self ;与 java 中的 this 类似
4>self 实质上是类实例化后的对象本身
5>类的实例化产生的就是对象:object;;把抽象的类创造出实际存在的事物
注:在 Python 中,实例的变量名如果以 __ 开头,就变成了一个私有变量
二. 面向对象的特性:封装, 继承, 多态
1>面向对象编程——Object Oriented Programming,简称 OOP,把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数
2>面向过程把函数继续切分为子函数,来降低系统的复杂度
1. 封装
封装实际上是把数据封装到某个地方,以后再去调用被封装在某处的内容或者数据
1>封装数据
2>调用封装数据:通过对象直接调用;通过self间接调用
eg:
创建一个类People,拥有的方法为砍柴,娶媳妇,回家:
实例化对象,执行相应的方法,显示如下:
张三,18岁,男,上山去砍柴
李四,22岁,男,开车去娶媳妇
赵六,10岁,女,辍学回家
属性:name,age,gender
方法:gohome(),kanchai(),quxifu()
注:对象可以实例化多个
附1:桟的数据结构
测试:
附2:队列的数据结构
测试:
2. 继承
父类和子类,又叫 基类和派生类
注:子类Dog和Cat分别继承了父类Animals的属性和方法,并且保留自己的属性和方法
2.1 重新父类的构造方法
第一种:
第二种:父类名.__init__(self,形参)
第三种:super(自己类的名称, self).__init__(形参)
优点:
<1>不需要明确告诉父类的名称
<2>如果父类改变,只需修改class语句后面的继承关系即可
2.2 新式类和经典类
1>python2.x里面支持经典类和新式类
2>python3.x里面仅支持新式类
2.3 多重继承
新式类:
按照广度优先算法,具体为先在整层或者同级别搜索,再深入一层或级别搜索:A--->B(C)---D
经典类:
按照深度优先算法,具体为先由浅到深,再返回与之开始时同一层或级别搜索:A---B--->D--->C--->D
3. 多态
当父类和子类有相同的方法时, 调用优先执行子类的方法
三. 特殊的类属性
执行结果:
print Animals.__module__
如果类不是被导入的, 显示为 __main__;如果类是被 import 导入的, 则显示类所在的模块名
四. 类属性
五. 实现查看类实例化对象的个数
六. 类方法和静态方法
1. 类方法
1.1 普通方法---第一个参数必须是 self( 对象 )
1.2 类方法---第一个参数是 cls( 类 )
2. 静态方法---不需要加特殊的第一个参数
七. property属性
property属性作用:
1>property可以定义一个方法名为私有属性的名字, 让用户可以访问, 但不能修改, 保护数据的安全性
注1:在类里边,以双下划线开头的属性,只在类里边生效,外部调用不生效
注2:python 解释器将 self.__ 属性名间接转换为 self._ 类名 __ 属性名self.__score = score
2>@属性名.setter在给属性赋值时, 先做判断
eg1:
eg2:
测试:
附:私有成员和共有成员
1>私有属性/方法: 类内部可以访问, 对象不能访问; 子类不能访问, 子类的对象不能访问
2>共有属性/方法: 私有属性可以访问和不可以访问的, 都可以访问
3>@属性名.deleter使用内置del删除属性时,自动执行的内容
附:property(fget, fset, fdel, fdoc)方法:
eg:property应用:信息分页显示
a.主机信息有很多, 为了美观, 分页显示
b.当用户选择第n页, 显示该页需要的数据从哪条开始, 哪条结束
c.将start, end返回给后端, 将需要的数据响应给前端
property属性前:
property属性后:
八. 特殊的实例方法
注:call当调用对象时自动执行
1. 改变类的字符串显示 __str__ 和 __repr__
功能: 简化脚本测试和调试时的实例输出
1>__str__ : 当打印对象时自动调用
2>__repr__ : 当在交互式环境中, 直接输入对象时, 自动调用
3>如果 __str__ 没有定义时, 那么打印对象自动调用 __repr__
4>如果 __repr__ 没有定义时
2. 自定义字符串的格式__format__
3. 索引:__getitem__ 和 __setitem__ 和 __delitem__
eg:
4. 切片: __getslice 和 __setslice__ 和 __delslice__
5. 类支持比较操作(<, <=, ==, !=, >, >=)
eg:房子与屋子
测试:
6. 迭代 __iter__
九. 元类(type)
在python中,一切皆对象; Linux下一切皆文件
注:Student 是个类, 实质上是个对象,Student 类是 type 类的一个实例化
1. 创建类
2. type动态创建类
1>type(对象)
2>type(类名, 元组方式存储父类,属性 )
十. with语句(语句上下文管理)
注:分析with语句底层发生了什么?
1>调用 __enter__ 方法, 返回的是文件对象
2>将文件对象起别名为f
3>运行完之后, 调用之前暂存 __exit__ 方法, 实现关闭文件
附:
linux使用工具:psutil
yum search python | grep devel
yum install -y python-devel.x86_64
pip install psutil
psutil应用: