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应用:


展开阅读全文

没有更多推荐了,返回首页