運(yùn)算符重載
python中所有的數(shù)據(jù)類(lèi)型都是類(lèi),數(shù)據(jù)都是對(duì)象所有的運(yùn)算符的操作帅霜,本質(zhì)都是在調(diào)用數(shù)據(jù)類(lèi)型對(duì)應(yīng)的魔法方法每個(gè)運(yùn)算符都對(duì)應(yīng)一個(gè)固定的魔法方法
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
# 重載加法運(yùn)算符
def __add__(self, other):
return self.age + other.age
# 重載加法運(yùn)算符
def __mul__(self, other):
return self.age * other
# 重載大于
def __gt__(self, other):
return self.age > other.age
def __repr__(self):
return str(self.__dict__)
stu1 = Student('小敏', 25, 68)
stu2 = Student('小月', 23, 79)
print(stu1 + stu2)
print(stu1 * 10)
print(stu1 > stu2)
allstudent = [Student('小敏', 25, 68), Student('小月', 23, 79)]
allstudent.sort()
print(allstudent)
# 練習(xí)勉吻,讓Student的對(duì)象支持乘法運(yùn)算父泳,運(yùn)算規(guī)則是:
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
# 重載加法運(yùn)算符
def __add__(self, other):
return self.age + other.age
# 重載乘法運(yùn)算符
def __mul__(self, other):
resault = []
for _ in range(other):
resault.append(self)
return resault
# 重載大于
def __gt__(self, other):
return self.age > other.age
def __repr__(self):
return '<' + str(self.__dict__)[1:-1] + '>'
stu1 = Student('小敏', 25, 68)
stu2 = Student('小月', 23, 79)
print(stu1 + stu2)
print(stu1 > stu2)
allstudent = [stu1, stu2]
allstudent.sort()
print(allstudent)
# 練習(xí)澈吨,讓Student的對(duì)象支持乘法運(yùn)算凶掰,運(yùn)算規(guī)則是:
stu3 = Student('小喵', 28, 82)
resault = stu3 * 2
print(resault)
stu3.name = '小狗'
print(resault)
resault[0].name = '李逵'
print(resault)
# 1.一個(gè)變量給另一個(gè)變量賦值:直接將地址賦值燥爷,賦完值后,兩個(gè)變量只想同一塊內(nèi)存區(qū)域并且相互影響
print('++++++++直接賦值++++++')
stu4 = stu1
print(id(stu4), id(stu1))
stu1.age = 1000
print(stu4)
print(stu1)
深拷貝和淺拷貝
淺拷貝和深拷貝(面試點(diǎn)E尘健)
a.淺拷貝
1.列表或字典的copy方法是淺拷貝前翎、前片也是淺拷貝
2.copy.copy(對(duì)象) - 復(fù)制指定的對(duì)象,產(chǎn)生一個(gè)新的對(duì)象
淺拷貝原理:將被拷貝的對(duì)象復(fù)制一份奶赠,產(chǎn)生一個(gè)新的數(shù)據(jù)鱼填,然后將新的數(shù)據(jù)的地址返回(不會(huì)復(fù)制子對(duì)象)
b.深拷貝
copy.deepcopy(對(duì)象) - 復(fù)制指定的對(duì)象,產(chǎn)生一個(gè)新的對(duì)象毅戈,如果這個(gè)對(duì)象中還有其他對(duì)象苹丸,子對(duì)象也會(huì)被復(fù)制
print('++++++++淺拷貝++++++')
stu5 = copy.copy(stu1)
stu5.name = '大黃'
print(stu1)
print(stu5)
print('++++++++深拷貝++++++')
stu6 = copy.deepcopy(stu1)
stu1.name = '大腦虎'
print(stu1)
print(stu6)
內(nèi)存管理
1.數(shù)據(jù)的存儲(chǔ)(內(nèi)存開(kāi)辟)
python的所有的變量都存儲(chǔ)在棧區(qū)間,對(duì)象都在堆區(qū)間
聲明變量或者給變量賦值苇经,是現(xiàn)在內(nèi)存(堆)中開(kāi)辟存儲(chǔ)數(shù)據(jù)赘理,然后將數(shù)據(jù)地址保存在變量中
但是數(shù)字和字符串,如果是用字符串或者數(shù)字給變量賦值扇单,不會(huì)直接開(kāi)辟空間保存數(shù)據(jù)商模,
而是現(xiàn)在內(nèi)存中檢查這個(gè)數(shù)據(jù)之前是否已經(jīng)存儲(chǔ)過(guò),如果已經(jīng)存儲(chǔ)直接使用上次保存的數(shù)據(jù)蜘澜,
沒(méi)有存儲(chǔ)才會(huì)開(kāi)辟新的空間保存數(shù)據(jù)
2.內(nèi)存的釋放
管理原理:
1.引用計(jì)數(shù):
python中每個(gè)對(duì)象都有一個(gè)屬性叫引用計(jì)數(shù)施流,用來(lái)保存當(dāng)前對(duì)象的引用的個(gè)數(shù)
2.python中的垃圾回收機(jī)制來(lái)判斷一個(gè)對(duì)象是否銷(xiāo)毀,就看這個(gè)對(duì)象的引用計(jì)數(shù)是否為0鄙信,
如果為0就會(huì)被銷(xiāo)毀
list1 = [1, 2]
list2 = [1, 2]
print(id(list1), id(list2))
num1 = 10
num2 = 10
print(id(num1), id(num2))
print('=================引用計(jì)數(shù)==================')
list3 = [1, 2]
print(getrefcount(list3))
套接字
服務(wù)器端
from socket import *
"""
進(jìn)行通信的兩端就是套接字瞪醋,有兩種類(lèi)型,分別是服務(wù)器套接字装诡、客戶端套接字
1.服務(wù)器套接字
"""
# 1.創(chuàng)建套接字對(duì)象
"""
family - 設(shè)置ip協(xié)議類(lèi)型银受,AF_INET(ipv4),AF_INET6(ipv6)
type - 設(shè)置傳輸協(xié)議類(lèi)型践盼,SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
"""
server = socket(family=AF_INET, type=SOCK_STREAM)
# 2.綁定ip地址和端口
"""
bind((ip地址,端口))
ip - 字符串宾巍,服務(wù)器對(duì)應(yīng)的ip地址
端口號(hào) - int咕幻,端口用來(lái)區(qū)分電腦上的不同的服務(wù)0 - 65535,0 - 1024是著名端口(避開(kāi))
同一時(shí)間一個(gè)端口只能綁定一個(gè)服務(wù)
"""
server.bind(('10.7.185.77', 8080))
# 3.開(kāi)始監(jiān)聽(tīng)請(qǐng)求
server.listen(512)
# 4.讓服務(wù)器一直運(yùn)行
while True:
print('監(jiān)聽(tīng)狀態(tài).....')
# 代碼運(yùn)行到這個(gè)位置,會(huì)停下來(lái)顶霞,等到客戶端給服務(wù)器發(fā)送請(qǐng)求位置
connect, addr = server.accept() # 5.接收請(qǐng)求
print(addr, '鏈接成功')
while True:
# 6.接收消息
"""
recv(bufsize) - 設(shè)置一次性能夠接收的數(shù)據(jù)大小的最大值肄程,單位是字節(jié)
"""
re_data = connect.recv(1024) # 保存接收到的數(shù)據(jù),返回的是字節(jié)
print('客戶端>>>', re_data.decode(encoding='utf-8'))
# 7.發(fā)送數(shù)據(jù)
message = input('>>>')
connect.send(message.encode())
# 8.關(guān)閉連接
connect.close()
客戶端
from socket import *
# 1. 創(chuàng)建套接字對(duì)象
client = socket()
# 2.連接服務(wù)器
client.connect(('10.7.185.77', 8080))
while True:
# 3.發(fā)送數(shù)據(jù)
message = input('請(qǐng)輸入:')
client.send(message.encode())
# 4.接收消息
re_data = client.recv(1024)
print('客戶端>>>', re_data.decode(encoding='utf-8'))