day16
一个子类继承多个父类时,只能继承一个父类的对象属性,能继承所有方法和类字段
在一个类继承多个类时,类名后括号中继承的顺序就是mro顺序列表中的顺序
运算符重载:所有的运算符对应的操作,本事都是在调用数据类型对应的魔法方法。每个运算符都对应一个魔法方法
class Stu(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def __add__(self, other): # self是加号前的数据,other是加号后的数据
return self.age + other.age
def __mul__(self, other):
pass
def __truediv__(self, other):
pass
def __lt__(self, other): # 大小比较运算符只需要重载一个
return self.age < other.age
# def __gt__(self, other):
# return self.score > other.score
stu1 = Stu('aaa', 18, 60)
stu2 = Stu('bbb', 19, 80)
print(stu1+stu2)
- 深浅拷贝
- 一个变量直接给另一个变量赋值:直接将地址赋值,赋完后两个变量指向同一块内存区域
- 浅拷贝:列表或字典的copy方法是浅拷贝、切片也是浅拷贝。copy.copy(),赋值指定的对象,产生一个新的对象。不会复制子对象
- 拷贝的基本原理:将被拷贝的对象复制一份产生一个新的数据,将其地址返回
import copy
class Stu:
def __init__(self, name, score):
self.name = name
self.score = score
def __copy__(self):
return Stu(self.name, self.score)
def __mul__(self, other: int):
return list((self.__copy__() for _ in range(other)))
stu = Stu('aaa', 60)
res = stu * 3
print(res)
stu2 = copy.copy(stu)
深拷贝:copy.deepcopy(对象),复制指定对象,产生新对象,如果这个对象中有其他的对象,子对象也会被复制
-
内存管理:栈区间与堆区间
- 数据的存储(内存开辟):python所有变量都存储在栈区间,对象都在堆区间;声明变量或者给变量赋值,是先在内存(堆)中开辟存储数据,然后将数据地址保存在变量中,数字和字符串有特殊情况,多个不同名的变量存储相同值的数字或字符串,所有变量指向的内存地址相同(不会直接开辟空间保存数据,而是先在内存中检测这个数据之前是否已经存储过,如果已经存储直接使用上次保存的数据,没有存储才会开辟新的空间保存数据)
- 内存释放:
- 引用计数:python中每个对象都有一个属性叫引用计数,用来保存当前对象的引用的个数;python中的垃圾回收机制判断一个对象是否销毁,就看这个对象的引用计数是否为0,如果为0就销毁(引用计数类似于linux的文件链接数)
套接字(socket):进行通信的两端就是套接字,分为服务端套接字和客户端套接字
-
创建套接字服务端
- 1.创建套接字对象
- 2.绑定ip地址和端口
- 3.开始监听请求
- 4.服务端开始运行
- 5.接受请求
- 6.接受消息
- 7.发送数据
- 8.关闭连接