多继承以及MRO
注意:继承不是复制!
- mro 解决多继承关系中出现的二义性问题.
- 快速确定mro(方法解析顺序)
- 1.首先确定继承关系树状图;
- 2.擦掉没有被指向的,并抹去其发出的指向箭头;
- 3.同级的情况先继承左边的(极左原理),不同级的如果能确定左右关系先继承左边的,确定不了关系的继承下边的;
- 4.重复以上操作.
- 这种方法可快速确定继承顺序.
类属性,实例属性.
- 类属性在内存中只保存一份,而实例属性在内存中根据对象的不同保存多份.
类方法,实例方法,静态方法.
- 类方法:只能由类来调用,@classmethod表示.至少需要一个cls参数.
- 实例方法:由对象调用,至少需要一个self参数.
- 静态方法:由类调用,不需要默认参数.与类对象,实例对象无关.工具方法.
- 实例对象可以调实例方法,类方法,静态方法;
- 类对象只能调用类方法和实例方法.
Property属性
属性内部进行一系列的计算,返回一个值.
Property属性的两种方式
- 1.装饰器
- 1.1经典类:只有一种装饰器,即@property
- 1.2新式类:有多种装饰器,即@property,@方法名.settler,@方法名.deleter,第一种是获取值,第二种是设置值,第三种是删除值,注意这三种值不代表同一个值.
- 2.类属性
- 创建一个值为property方法的返回值的类属性,这个类属性其实是一个property属性
- 定义三个方法,分别为get_xx,set_xx,del_xx,分别对同一个属性进行获取,修改,删除,还有一个参数是对该属性进行说明,获取该属性的描述信息.
- property属性的应用
- 1.对私有属性添加getter和settler方法,可以对私有属性进行访问.并使用类属性方式创建一 个property属性,也可以采用装饰器的方式对一个方法进行装饰,此时可以从外部对私有属性进行访问.
- 注意:如果考虑python版本的兼容性,类属性方式对于不同的版本是兼容的.
上下文管理器
- 一个具有__enter__() 和 exit()方法的对象叫做上下文管理器
- with + 上下文管理器对象+enter()方法的返回值,其中添加了with就可以自动管理上下文.
- with 先判断后面的对象是不是上下文管理器;
- 如果是上下文管理器,则调用__enter__()方法,将返回值赋予as后面的变量;
- 使用该变量完成操作后,会自动调用__exit__()方法,即使遇到异常后也会关闭.
- 示例:
上下文管理器
import socket
class SocketManager():
def __init__(self,ip,port):
self.addr = (ip,port)
def __enter__(self):
self.tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.tcp_socket.connect(self.addr)
msg = input()
self.tcp_socket.send(msg.encode())
return self.tcp_socket
def __exit__(self, exc_type, exc_val, exc_tb):
self.tcp_socket.close()
with SocketManager("127.0.0.1",8080) as s:
s.send()
s.recv()
`