day16總結(jié):運算符重載、拷貝胰苏、內(nèi)存管理和套接字(2019-05-07)

一硕蛹、運算符重載

  • 通過在類中實現(xiàn)運算符對應(yīng)的魔法方法,來讓類的對象支持相關(guān)運算符的操作
  • python中所有的數(shù)據(jù)類型都是類硕并,數(shù)據(jù)都是對象法焰。
  • 所有的運算符對應(yīng)的操作,本質(zhì)都是在調(diào)用數(shù)據(jù)類型對應(yīng)的魔法方法倔毙。(每個運算符都對應(yīng)一個固定的魔法方法)
class Student(object):
    def __init__(self, name, age=0, score=0):
        self.name = name
        self.age = age
        self.score = score

    def __repr__(self):
        return str(self.__dict__)

    # 重載加法預(yù)算符
    # self +  other = return 返回值
    def __add__(self, other):
        return self.age + other.age

    # 重載乘法運算符
    def __mul__(self, other):
        return self.score * other

    # >
    def __gt__(self, other):
        return self.score > other.score

    # <
    # def __lt__(self, other):
    #     return self.score < other.score

    # 注意: >和<只需要重載一個


stu1 = Student('小明', 18, 60)
stu2 = Student('小花', 22, 80)

print(stu1 + stu2)
print(stu1 * 10)
print(stu1 > stu2)
print(stu1 < stu2)


all_students = [stu1, stu2, Student('小小', 17, 55), Student('xiaohong', 25, 70)]
all_students.sort()
print(all_students)

補充: 重載

  • 函數(shù)的重載:函數(shù)名相同但是參數(shù)不同的函數(shù)可以有多個埃仪,叫做函數(shù)的重載。(但是python不支持函數(shù)的重載)

二陕赃、拷貝(面試點)

1.直接賦值

  • 一個變量直接給另外一個變量賦值:直接將地址賦值卵蛉,賦完后兩個變量指向同一塊內(nèi)存區(qū)域,并且相互影響

2.拷貝原理

  • 將被拷貝的對象復(fù)制一份么库,產(chǎn)生一個新的數(shù)據(jù)傻丝,然后將新的數(shù)據(jù)的地址返回

3.淺拷貝

  • 列表字典copy方法是淺拷貝、切片也是淺拷貝
  • copy.copy(對象):復(fù)制指定的對象诉儒,產(chǎn)生一個新的對象(不會復(fù)制子對象)
dog1 = Dog('財財')
stu2 = Student('Lisa', 18, 60)
stu2.dog = dog1

stu4 = copy.copy(stu2)

print('stu4:', stu4)
stu2.name = '小花'
print(stu2, stu4)

4.深拷貝

  • copy.deepcopy(對象):復(fù)制指定的對象葡缰,產(chǎn)生一個新的對象。如果這個對象中有其他的對象忱反,子對象也會被復(fù)制
dog1 = Dog('財財')
stu2 = Student('Lisa', 18, 60)
stu2.dog = dog1

stu4 = copy.deepcopy(stu2)

print('stu4:', stu4)
stu2.name = '小花'
print(stu2, stu4)

三泛释、內(nèi)存管理(面試點)

1. 數(shù)據(jù)的存儲(內(nèi)存開辟)

  • python的變量都存儲在棧區(qū)間,對象都在堆區(qū)間
  • 聲明變量或者給變量賦值缭受,是先在內(nèi)存(堆)中開辟存儲數(shù)據(jù),然后將數(shù)據(jù)地址保存在變量中
  • 但是數(shù)字和字符串特殊该互,如果是用數(shù)字或者字符串給變量賦值米者,不會直接開辟空間保存數(shù)據(jù),而是先在內(nèi)存檢測這個數(shù)據(jù)之前是否已經(jīng)存儲過,如果已經(jīng)存儲直接用上次保存的數(shù)據(jù)蔓搞,沒有存儲才會開辟新的空間保存數(shù)據(jù)

2. 內(nèi)存的釋放

1)引用計數(shù)
  • python每個對象都有一個屬性叫引用計數(shù)胰丁,用來保存當(dāng)前對象的引用的個數(shù)
2)垃圾回收機制
  • python中的垃圾回收機制來判斷一個對象是否銷毀,就看這個對象的引用計數(shù)是否為零喂分,如果為零就會被銷毀
  • 注意循環(huán)引用的問題(另有特殊機制去銷毀)
from sys import getrefcount

list1 = [1, 2]
print(getrefcount(list1))

# def yt_getrefcount(obj):
#     # obj = list1
#     return 獲取obj對應(yīng)的數(shù)據(jù)的引用個數(shù)

# yt_getrefcount(list1)

# 讓引用計數(shù)增加
list2 = list1
print(getrefcount(list1))
dict1 = {'a': list2}
print(getrefcount(list1))

#
# num = 100
# print(getrefcount(num))
# num1 = 100
# print(getrefcount(num))

# 讓引用計數(shù)減少
print(getrefcount(list1))
list2 = 100
print(getrefcount(list1))
del dict1['a']
print(getrefcount(list1))
del list1
# print(getrefcount(list1))

四锦庸、套接字(socket)

  • 進(jìn)行通信的兩端就是套接字;有兩種類型蒲祈,分別是服務(wù)器套接字甘萧、客戶端套接字
  • 導(dǎo)入socket模塊:from socket import * 或 import socket

1. 服務(wù)器套接字(server)

1)創(chuàng)建套接字對象
  • server = socket() 或者 server = socket(family=AF_INET, type=SOCK_STREAM)(默認(rèn)參數(shù),可省略不寫)
  • 參數(shù)說明:
    family:設(shè)置ip協(xié)議類型, AF_INET(ipv4)梆掸,AF_INET6(ipv6)
    type:設(shè)置傳輸協(xié)議類型, SOCK_STREAM(TCP)扬卷,SOCK_DGRAM(UDP)
2)綁定地址(ip地址和端口)
  • server.bind(('10.7.185.82', 8080))
  • 語法:bind((ip地址, 端口))
  • 參數(shù)說明:
    ip地址:字符串,服務(wù)器對應(yīng)的ip地址
    端口號:int, 端口號用來區(qū)分一臺電腦上的不同的服務(wù)酸钦。范圍:0-65535, 其中0-1024是著名端口怪得,一般不選。同一時間一個端口只能綁定一個服務(wù)
3)監(jiān)聽請求
  • server.listen(512)
4)讓服務(wù)器一直運行
  • while True:
5)接收請求
  • connect, address = server.accept()
  • 代碼運行到這個位置卑硫,會停下來徒恋,等到有客戶端給服務(wù)器發(fā)送請求為止
6)接收數(shù)據(jù)
  • redata = connect.recv(1024)
  • print(redata.decode(encoding='utf-8'))
  • 參數(shù)說明:
    recv(bufsize):bufsize,設(shè)置一次性能夠接收的數(shù)據(jù)大小的最大值,單位是字節(jié)
    返回的數(shù)據(jù)類型是字節(jié)
7)發(fā)送數(shù)據(jù)
  • send_message = input('輸入文字:')
  • connect.send(send_message.encode())
8)關(guān)閉連接
  • connect.close()
實例:
from socket import *

# 1.創(chuàng)建套接字對象
server = socket()
# 2.綁定地址
server.bind(('10.7.185.82', 8080))
# 3.監(jiān)聽
server.listen(512)

# 4.讓服務(wù)器一直運算
while True:
    print('開始監(jiān)聽....')
    # 5. 接受請求
    connect, address = server.accept()

    # 6.接收數(shù)據(jù)
    redata = connect.recv(1024)
    message = redata.decode(encoding='utf-8')

    # 7.發(fā)送數(shù)據(jù)
    if message == 'text':
        # 發(fā)送文字
        send_message = input('輸入文字:')
        connect.send(send_message.encode())
    elif message == 'image':
        # 發(fā)送圖片
        with open('server/luffy4.jpg', 'rb') as f:
            image_data = f.read()
        # connect.send('你好'.encode())
        connect.send(('{"type":"jpg", "lengh":%d}' % len(image_data)).encode())
        connect.send(image_data)

    # 8.關(guān)閉連接
    connect.close()

2. 客戶端套接字(client)

1)創(chuàng)建套接字對象
  • client = socket()
2)連接服務(wù)器
  • client.connect(('10.7.185.82', 8085))
3)發(fā)送數(shù)據(jù)
  • message = input('請輸入:')
  • client.send(message.encode())
4)接收數(shù)據(jù)
  • re_data = client.recv(1024)
  • print(re_data.decode(encoding='utf-8'))
實例:
from socket import socket

# 1.創(chuàng)建套接字對象
client = socket()

# 2.連接服務(wù)器
client.connect(('10.7.185.82', 8080))

# 3.發(fā)送數(shù)據(jù)
print('1.獲取文字請輸入text\n2.獲取圖片請輸入image')
send_message = input(':')
client.send(send_message.encode())

# 4.接收數(shù)據(jù)
if send_message == 'text':
    text_data = client.recv(1024)
    print(text_data.decode(encoding='utf-8'))
elif send_message == 'image':
    image_message = client.recv(1024)
    print(image_message.decode(encoding='utf-8'))

    while True:
        image_data = client.recv(1024)
        if len(image_data) == 0:
            break

        with open('client/image.jpg', 'ab') as f:
            f.write(image_data)

client.close()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欢伏,一起剝皮案震驚了整個濱河市入挣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颜懊,老刑警劉巖财岔,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異河爹,居然都是意外死亡匠璧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門咸这,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夷恍,“玉大人,你說我怎么就攤上這事媳维∧鹧” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵侄刽,是天一觀的道長指黎。 經(jīng)常有香客問我,道長州丹,這世上最難降的妖魔是什么醋安? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任杂彭,我火速辦了婚禮,結(jié)果婚禮上吓揪,老公的妹妹穿的比我還像新娘亲怠。我一直安慰自己,他們只是感情好柠辞,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布团秽。 她就那樣靜靜地躺著,像睡著了一般叭首。 火紅的嫁衣襯著肌膚如雪习勤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天放棒,我揣著相機與錄音姻报,去河邊找鬼。 笑死间螟,一個胖子當(dāng)著我的面吹牛吴旋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厢破,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼荣瑟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摩泪?” 一聲冷哼從身側(cè)響起笆焰,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎见坑,沒想到半個月后嚷掠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡荞驴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年不皆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熊楼。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡霹娄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲫骗,到底是詐尸還是另有隱情犬耻,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布执泰,位于F島的核電站枕磁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏术吝。R本人自食惡果不足惜计济,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一晴楔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峭咒,春花似錦、人聲如沸纪岁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幔翰。三九已至漩氨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遗增,已是汗流浹背叫惊。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留做修,地道東北人霍狰。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像饰及,于是被迫代替她去往敵國和親蔗坯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容