OPP
面向对象编程
object(对象)
什么是对象
对象是指现实中的物体或实体
什么是面向对象
把一切看成对象(实例), 让对象和对象之建立关联关系
对象都有什么特征
对象有很多属性(名词)
姓名, 年龄, 性别,
对象有很多行为(动作,动词)
学习,吃饭,睡觉,踢球, 工作
什么是类: class
拥有相同属性和行为的对象分为一组,即为一个类
类是用来描述对象的工具,用类可以创建同类对象
类的创建语句:
语法:
class 类名(继承列表):
'''类的文档字符串'''
实例方法定义(类内的函数称为方法method)
类变量定义
类方法定义
静态方法定义
作用:
创建一个类
用于描述此类对象的行为和属性
类用于创建此类的一个或多个对象(实例)
示例:
class Dog:
pass
构造函数
表达式:
类名([创建传参列表])
作用:
创建这个类的实例对象,并返回此实例对象的引用关系
实例(对象)说明
实例有自己的作用域和名字空间,可以为该实例添加实例变量(属性)
实例可以调用类方法和实例方法
实例可以访问类变量和实例变量
示例:
class Dog:
pass
dog1 = Dog()
实例方法:
语法:
class 类名(继承列表):
def 实例方法名(self, 参数1, 参数2, ...):
'''实例方法的文档字符串'''
语句块
作用:
用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为
说明:
实例方法实质是函数,是定义在类内的函数
实例方法至少有一个形参,第一个形参代表调用这个方法的实例,一般命名为'self'
实例方法的调用语法:
实例.实例方法名(调用传参)
或
类名.实例方法名(实例, 调用传参)
属性 attribute(也叫实例变量)
每个实例都可以有自己的变量,此变量称为实例变量(也叫属性)
属性的使用语法:
实例.属性名
赋值规则:
首次为属性赋值则创建此属性
再次为属性赋值则必变属性的绑定关系
作用:
用来记录对象自身的数据
删除属性
用del语句可以删除一个对象的实例变量
语法:
del 对象.实例变量名
示例:
class Cat:
pass
c1 = Cat() # 创建变量
c1.color = "白色" # 添加属性
print(c1.color) # 白色
del c1.color # 删除属性
print(c1.color) # 属性错误
初始化方法
作用:
对新创建的对象添加实例变量(属性)或相应的资源
语法格式:
class 类名(继承列表):
def init(self [,形参列表]):
语句块
说明:
1. 初始化方法名必须为__init__ 不可改变
2. 初始化方法会在构造函数创建实例后自动调用,且将实例自身通过第一个参数 self传入__init__方法
3. 构造函数的实参将通过__init__方法的形参列表传入 init 方法中
4. 初始化方法内部如果需要返回则只能返回None
析构方法
语法:
class 类名(继承列表):
def del(self):
语句块
说明:
析构方法在对象销毁时被自动调用
作用:
清理此对象所占用的资源
预置实例属性
dict 属性
此属性绑定一个存储此实例自身实例变量(属性)的字典
示例:
class Dog:
pass
dog1 = Dog()
print(dog1.dict)
dog1.kinds = '京巴'
print(dog1.dict)
class 属性
此属性用来绑定创建此实例的类
作用:
可以借助此属性来访问创建此实例的类
示例:
class Dog:
pass
dog1 = Dog()
dog2 = Dog()
dog3 = dog1.class() # 创建dog1的同类对象
类变量 class variable(也叫类属性)
类变量是类的属性,此属性属于类
作用:
用来记录类相关的数据
说明:
类变量可以通过类直接访问
类变量可以通过类的实例直接访问
类变量可以通过此类的实例的__class__属性间接访问
示例:
class Human:
count = 0 # 创建类变量
继承/派生的名词
基类(base class), 超类(super class), 父类(father class)
派生类(derived class) / 子类(child class)
单继承
语法:
class 类名(基类名):
语句块
说明
单继承是指派生类由一个基类衍生出来的类
继承说明:
任何类都直接或间接的继承自object类
object类是一切类的超类(祖类)
类的__base__ 属性
__base__属性用来记录此类的基类
用于类的函数
issubclass(cls, class_or_tuple) 判断一个类是否继承自其它的类,如果此类cls是class或 tuple中的一个派生子类则返回True,否则返回False
示例:
class A:
pass
class B(A):
pass
class C(B):
pass
issubclass(C, (A, B)) # True
issubclass(C, (int, str)) # False
封装 enclosure
封装是指隐藏类的实现细节,让使用者不用关心这些细节
封装的目的是让使用者尽可能少的实例变量(属性)进行操作
私有属性:
python类中,以双下划线'__'开头,不以双下划线结尾的标识符为私有成员,在类的外部无 法直接访问
函数重写 override
重写是在自定义的类内添加相应的方法,让自定义的类生成的对象(实例)像内建对象一样进行内建的函数操作
数值转换函数的重写
def complex(self) complex(obj) 函数调用
def int(self) int(obj) 函数调用
def float(self) float(obj) 函数调用
def bool(self) bool(obj) 函数调用
内建函数的重写
abs abs(obj)
len len(obj)
reversed reversed(obj)
round round(obj)
布尔测试函数的重写
格式 def bool(self):
...
作用:
用于bool(obj) 函数取值
用于if语句真值表达式中
用于while语句真值表达式中
说明:
1. 优先调用__bool__方法取值
2. 如果不存在__bool__方激动 ,则用__len__()方法取值后判断是否为零值,如果不为零 返回True,否则返回False
3. 如果再没有__len__方法,则直接返回True
迭代器(高级)
什么是迭代器
可以通过next(it) 函数取值的对象就是迭代器
迭代器协议:
迭代器协议是指对象能够使用next函数获取下一项数据,在没有下一项数据时触发 一个StopIterator来终止迭代的约定
实现方法:
类内需要有 next(self) 方法来实现迭代器协议
语法形式:
class MyIterator
def next(self):
迭代器协议的实现
return 数据
什么是可迭代对象
是指能用iter(obj) 函数返回迭代器的对象(实例)
可迭代对象内部一定要定义__iter__(self)方法来返回迭代器
可迭代对象的语法形式:
class MyIterable:
def iter(self):
语句块
return 迭代器
异常(高级)
回顾异常相关的语句:
try-except 用来捕获异常通知
try-finally 用来做一定要做的事情
raise 用来发生异常通知
assert 用来根据条件来发出AssertionError类型的异常通知
with 语句
语法:
with 表达式1 [as 变量1], 表达式2 [as 变量2]:
语句块
作用:
使用于对资源进行访问的场合,确保使用过程中不管是否发生异常,都会执行必须的'清 理'操作,并释放资源
如: 文件使用后自动关闭, 线程中锁的自动获取和释放等
说明:
能够用于with语句进行管理的对象必须是环境管理器
环境管理器:
1. 类内有__enter__ 和 __exit__实例方法的类被称为环境管理器
2. 够用with语句管理的对象必须是环境管理器
3. __enter__方法将在进入with语句时被调用,并返回由 as变量管理的对象
4. __exit__将在离开with语句时被调用,且可以用参数来判断在离开with语句时是否有 异常发生并做出相应的处理
示例:
class A:
def enter(self):
print("已进入with语句")
return self # 返回的对象将由 as绑定
def exit(self, exc_type, exc_val, exc_tb):
print("已离开with语句")
对象的属性管理函数:
1. getattr(obj, name[, default]) 从一个对象得到对象的属性;getattr(x, 'y') 等同于x.y; 当 属性不存在时,如果给
出default参数,则返回default,如果没有给出default 则产生一个AttributeError错误
2. hasattr(obj, name) 用给定的name返回对象obj是否有此属性,此种做法可以避免在 getattr(obj, name)时引发错误
3. setattr(obj, name, value) 给对象obj的名为name的属性设置相应的值value, set(x, 'y', v) 等同于 x.y = v
4. delattr(obj, name) 删除对象obj中的name属性, delattr(x, 'y') 等同于 del x.y
运算符重载
什么是运算符重载
让自定义的类生成的对象(实例)能够使用运算符进行操作
作用:
让自定义的类的实例像内建对象一样运行运算符操作
让程序简洁易读
对自定义的对象,将运算符赋予新的运算规则
算术运算符的重载:
add(self, rhs) self + rhs 加法
sub(self, rhs) self - rhs 减法
mul(self, rhs) self * rhs 乘法
truediv(self, rhs) self / rhs 除法
floordiv(self, rhs) self // rhs 地板除法
mod(self, rhs) self % rhs 求余
pow(self, rhs) self ** rhs 冪
注: rhs (right hands side) 右手边
反向算术运算符的重载
当左手边的类型为内建类型,右手边为自定义类型时,要实现运算必须用以下方法重载
反向算术运算符的重载:
radd(self, lhs) lhs + self 加法
rsub(self, lhs) lhs - self 减法
rmul(self, lhs) lhs * self 乘法
rtruediv(self, lhs) lhs / self 除法
rfloordiv(self, lhs) lhs // self 地板除法
rmod(self, lhs) lhs % self 求余
rpow(self, lhs) lhs ** self 冪
复合赋值算术运算符的重载
iadd(self, rhs) self += rhs 加法
isub(self, rhs) self -= rhs 减法
imul(self, rhs) self *= rhs 乘法
itruediv(self, rhs) self /= rhs 除法
ifloordiv(self, rhs) self //= rhs 地板除法
imod(self, rhs) self %= rhs 求余
ipow(self, rhs) self **= rhs 冪
比较运算符的重载
lt(self, rhs) self < rhs 小于
le(self, rhs) self <= rhs 小于等于
gt(self, rhs) self > rhs 大于
ge(self, rhs) self >= rhs 大于等于
eq(self, rhs) self == rhs 等于
ne(self, rhs) self != rhs 不等于
注:
比较运算符通常返回True或False
位运算符重载
invert(self) ~ self 取反(一元运算符)
and(self, rhs) self & rhs 位与
or(self, rhs) self | rhs 位或
xor(self, rhs) self ^ rhs 位异或
lshift(self, rhs) self << rhs 左移
rshift(self, rhs) self >> rhs 右移
反向位运算符重载
rand(self, lhs) lhs & self 位与
ror(self, lhs) lhs | self 位或
rxor(self, lhs) lhs ^ self 位异或
rlshift(self, lhs) lhs << self 左移
rrshift(self, lhs) lhs >> self 右移
复合赋值位运算符重载
iand(self, rhs) self &= rhs 位与
ior(self, rhs) self |= rhs 位或
ixor(self, rhs) self ^= rhs 位异或
ilshift(self, rhs) self <<= rhs 左移
irshift(self, rhs) self >>= rhs 右移
一元运算符的重载
neg(self) - self 负号
pos(self) + self 正号
invert(self) ~ self 取反
一元运算符的重载方法:
class 类名:
def xxx(self):
...
运算符重载说明:
运算符重载不能改变运算符的优先级
索引和切片运算符的重载
getitem(self, i) x = self[i] 索引/切片取值
setitem(self, i, v) self[i] = v 索引/切片赋值
delitem(self, i) del self[i] del语句删除索引等
作用:
让自定义的类型的对象能够支持索引和切片操作
slice 构造函数
作用:
用于创建一个Slice切片对象, 此对象存储一个切片的起始值,终止值和步长信息
slice(start, stop=None, step=None) 创建一个切片对象
slice的对象的属性:
s.start 切片起始值,默认为None
s.stop 切片终止值,默认为None
s.step 切片步长 ,默认为None

浙公网安备 33010602011771号