一 复习
私有化:命名的时候两个下划线开头(不对外公开)
getter和setter
getter --- 获取属性前想做别的事情
setter --- 想要给属性赋值的时候做别的事情
1)属性名前加一个下划线
2)添加getter
@property
def getter名(self):
做别的事情
return 值
3)添加setter
@getter名.setter
def setter名(self,参数):
做别的事情
给属性赋值
3.方法:
1)对象方法
怎么声明:直接声明在类中的函数
特点:有默认参数self,不需要传参,指向当前对象
怎么调用:对象调用
什么时候用:实现函数的功能需要对象的属性
2)类方法
怎么声明:声明前加@classmethod
特点:有默认参数cls,不需要传参,指向当前类
怎么调用:类调用
什么时候用:实现函数的功能不需要对象属性的前提下,需要类的字段
3)静态方法
怎么声明:声明前加@staticmethod
特点:没有默认参数
怎么调用:类调用
什么时候用:实现函数功能既不需要类也不需要类的字段
4.继承 --- 让子类直接拥有父类的属性和方法
python支持继承语法,默认的类都是继承object;并支持多继承
1)子类添加内容
字段和方法直接声明
添加对象属性
注意:多继承的时候可以集成多个类的方法和字段,但是只能继承第一个类的属性。
#多继承
class Animal(object):
def __init__(self):
self.age = 0
self.weight = 10
@staticmethod
def eat(food):
print('动物吃%s'% food)
class Fly(object):
pass
二 类的重载方法
1.所有的运算符都可以重载,只需要定义相应的函数就可以了
例如:
重载加法
self + other = return 返回值
def __add__(self, other):
return self.score + other.score
stu1 = Student('xioa',12,31)
stu2 = Student('xi',13,133)
print(stu1+stu2)
练习:让Student的对象支持乘法运算,运算规则是:
*3
class Student:
def __init__(self, name, age=10, score=0):
self.name = name
self.age = age
self.score = score
def __repr__(self):
return '<'+str(self.__dict__)[1:-1]+'>'
def __mul__(self, other):
result = []
for _ in range(other):
result.append(self)
return result
stu3 = Student('张三',10,0)
# print(stu3)
# result = stu3*3
# print(result)
print(stu3.__mul__(3))
三 深拷贝和浅拷贝
要注意引用: from copy import*
注意:一个变量直接给另外变量赋值:直接将地址赋值,赋完之后两个变量指向同一个地址,并且相互影响
-
a.浅拷贝
- 1)列表或字典的copy方法是浅拷贝,切片也是浅拷贝
- 2)copy.copy(对象) -- 复制指定的对象,产生一个新的对象
拷贝原理:将被拷贝的对象复制一份,产生一个新的数据,然后将新的数据地址返回
-
b.深拷贝
- copy.deepcopy(对象) -- 复制指定的对象产生一个新的对象。如果这个对象中有其他的的对象,子对象也会复制
四 数据的存储
引用:from sys import getrefcount
1.数据的存储(内存的开辟)
python中所有的变量都在栈区间,对象都在堆区间。
- 声明变量或者给变量赋值,是先在内存中(堆)开辟存储数据,然后将数据地址保存在变量中
- 但是数字和字符串特殊,如果是用数字或者字符串给变量赋值,他不会直接开辟空间保存数据,
- 而是先在内存检测这个数据之前是否已经存储过,如果已经存储过就直接用上次保存的数据,
没有存储才会开辟空间。
2.内存释放
1)引用计数
python中每个对象都有一个人属性叫引用计数,用来保存当前对象的引用的个数2)
python中的垃圾回收机制来判断一个对象是否销毁,就看这个对象的引用基数是否为0,如果为0就销毁。
list1 = [1,2,3]
print(getrefcount(list1))
# 让引用计数增加
list2 = list1
dict1 ={'a':list2}
print(getrefcount(list1))
num = 10
print(getrefcount(num))
# 让引用计数减少
list2 = 0
print(getrefcount(list1))
五 服务器
from socket import *
1,创建套接字对象
- 1)family --- 设置ip协议类型,AF_INET(ipv4),AF_INET6(ipv6)
- 2)type -- 设置传输协议类型,SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
server = socket(family = AF_INET,type = SOCK_STREAM)
2.绑定ip地址和端口
bind((ip地址,端口))
ip地址 --- 字符串,服务器对应的ip地址
端口号 --- int,端口号用来区分一台电脑上的不同服务。0-65535,0-1024是著名端口一般不选
同一时间一个端口只能绑定一个服务
addr = ('10.7.185.63',9008)
server .bind(addr)
3.开始监听请求
server.listen(520)
print('开始监听')
4.让服务器保持运行状态
5.接受请求
while True:
connect,addr = server.accept()
print('连接成功。。。')
6.接收消息(听别人说)
'''
recv(bufsize) -- bufsize,设置一次性能接收数据的最大值(单位是字节)
返回的是字节
while True:
re_date = connect.recv(1024)
print(re_date.decode(encoding='utf-8'))
7.发送数据(说给别人听)
message = input('请输入:')
connect.send(message.encode())
8.关闭连接(挂电话)
connect.close()
from socket import *
六 服务器
1.创建套接字对象
client = socket()
2.连接服务器
client.connect(('10.7.185.64',8001))
3.发送消息
while True:
message = input('请输入:')
client.send(message.encode())
4.接收消息
re_date = client.recv(1024)
print(re_date.decode(encoding='utf-8'))