day16----總結(jié) 內(nèi)存管理和拷貝

day16-總結(jié) 內(nèi)存管理和拷貝

  • 1.多繼承

  • python中的類支持多繼承(讓一個(gè)類同時(shí)繼承多個(gè)類)
  • 多繼承的時(shí)候,子類只能繼承第一個(gè)父類所有的對(duì)象屬性和方法,后面的父類只能繼承字段和方法
class Animal(object):
    num = 100

    def __init__(self):
        self.age = 0
        self.gender = '雄'

    @classmethod
    def func1(cls):
        print('動(dòng)物的類方法')


class Fly(object):
    name = '飛行器'

    def __init__(self):
        self.height = 100
        self.time = 2
        self.speed = 150


    def func2(self):
        print('飛行的對(duì)象方法')



class Bird(Animal, Fly):
    pass


bird1 = Bird()
print(Bird.name, Bird.num)      # 飛行器 100

bird1.func1()  # 動(dòng)物的類方法
bird1.func2()  # 飛行的對(duì)象方法

  • 運(yùn)算符重載

  • 1.運(yùn)算符
python中所有的類型都是類,所有的數(shù)據(jù)都是對(duì)象;
python中使用所有的運(yùn)算符都是在調(diào)用類中相應(yīng)的方法,每一個(gè)運(yùn)算符對(duì)應(yīng)什么方法是固定的
某種數(shù)據(jù)是否支持某種運(yùn)算符操作就看這個(gè)數(shù)據(jù)類型是否實(shí)現(xiàn)了對(duì)應(yīng)的方法
  • 2.運(yùn)算符重載是指在不同的類中實(shí)現(xiàn)同樣的運(yùn)算符對(duì)應(yīng)的函數(shù)
類的對(duì)象默認(rèn)只支持:==, !=
注意:< 和 > 符號(hào)只需重載一個(gè)就可以了

深拷貝和淺拷貝

  • 1.直接賦值
直接賦值就是將變量中的地址賦給新的變量;復(fù)制后兩個(gè)變量的地址一樣
(全變)
  • 2.拷貝
不管深拷貝還是淺拷貝,都會(huì)對(duì)原數(shù)據(jù)進(jìn)行賦值產(chǎn)生新的地址
  • 3.淺拷貝
字符串、列表和元組的切片;對(duì)象.copy();copy模塊中的copy方法都是淺拷貝
淺拷貝只拷貝當(dāng)前對(duì)象,不拷貝子對(duì)象
(子對(duì)象改變,其他不變)
  • 4.深拷貝
copy模塊中的deepcopy方法就是深拷貝
(全部不變)
# 練習(xí):
a = ['color', 'height', 'background']
b = [a, 'aaa', 'bbb']
c1 = b
c2 = copy(b)
c3 = deepcopy(b)
a[-1] = ['BG']
b.append('ccc')

# b = [['color', 'height', 'background'], 'aaa', 'bbb']
# 問(wèn)題:print(c1), print(c2), print(c3)
print(c1)   # [['color', 'height', ['BG']], 'aaa', 'bbb', 'ccc']  (全部改變)
print(c2)   # [['color', 'height', ['BG']], 'aaa', 'bbb']  (子對(duì)象改變,其他不變)
print(c3)   # [['color', 'height', 'background'], 'aaa', 'bbb']  (全部不變)

枚舉

from enum import Enum, unique

枚舉值的特點(diǎn):
1.可以通過(guò)有意義的屬性名直接顯示數(shù)據(jù)
2.每個(gè)數(shù)據(jù)的值不能修改
3.可以做到不同的數(shù)據(jù)的值唯一(加上@unique)


內(nèi)存管理

  • 1.內(nèi)存開(kāi)辟

內(nèi)存區(qū)間分為棧區(qū)間和堆區(qū)間;
棧區(qū)間的內(nèi)存自動(dòng)開(kāi)辟自動(dòng)釋放;
堆區(qū)間的內(nèi)存需要程序員手動(dòng)開(kāi)辟和釋放;
但是python中已經(jīng)將堆區(qū)間內(nèi)存的開(kāi)辟和釋放自動(dòng)化

a. 當(dāng)每次給變量賦值的時(shí)候,系統(tǒng)會(huì)先在堆區(qū)間開(kāi)辟空間將數(shù)據(jù)存起來(lái),再將數(shù)據(jù)在堆區(qū)間對(duì)應(yīng)的地址存在變量中,變量在棧區(qū)間中。

b. 數(shù)字和字符串?dāng)?shù)據(jù)在開(kāi)辟空間的時(shí)候,會(huì)先檢查內(nèi)存中之前是否有這個(gè)數(shù)據(jù),如果有,直接使用之前的數(shù)據(jù),沒(méi)有就重新開(kāi)辟保存。

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

棧區(qū)間:全局棧區(qū)間在程序結(jié)束后銷毀,函數(shù)棧區(qū)間在函數(shù)調(diào)用結(jié)束的時(shí)候銷毀(自動(dòng))。
堆區(qū)間:看一個(gè)對(duì)象是否銷毀,就看這個(gè)對(duì)象的引用計(jì)數(shù)是否是0,是0就銷毀,反之不銷毀。(垃圾回收機(jī)制)
注意:python中針對(duì)對(duì)象的循環(huán)引用已經(jīng)做了處理,程序員不需要寫(xiě)其他額外代碼來(lái)解決循環(huán)引用問(wèn)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容