day16-深拷貝和淺拷貝

多繼承

1.多繼承

python中的類(lèi)支持多繼承

class 子類(lèi)(父類(lèi)1, 父類(lèi)2,...):
pass

class Fly(object):
    """飛行類(lèi)"""
    f_num = 10

def __init__(self):
    self.height = 0
    self.speed = 0
    self.time = 0

def start(self, speed):
    self.speed = speed

# print(self.speed)

?    print('開(kāi)始飛行')

class Animal(object):
    num = 100

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

@staticmethod
def eat(food: str):
    print('吃'+food)

class Bird(Animal, Fly):
    pass

b1 = Bird()

# 字段都可以繼承

print(Bird.f_num, Bird.num)   # 10, 100

# 方法都可以繼承

b1.start(10)
Bird.eat('肉')

# 只能繼承第一個(gè)父類(lèi)的對(duì)象屬性

# print(b1.age, b1.gender)

# print(b1.height, b1.time, b1.speed)

運(yùn)算符的重載

1. 運(yùn)算符

python中所有的數(shù)據(jù)類(lèi)型本質(zhì)都是類(lèi)皂岔, 所有的數(shù)據(jù)本質(zhì)就是對(duì)象旭从。

在使用運(yùn)算符對(duì)數(shù)據(jù)進(jìn)行操作的時(shí)候,實(shí)質(zhì)是調(diào)用運(yùn)算符對(duì)應(yīng)的魔法方法;
運(yùn)算符前面的數(shù)據(jù)類(lèi)型琼掠,決定了函數(shù)哪個(gè)類(lèi)中對(duì)應(yīng)的魔法方法

每個(gè)運(yùn)算符都有自己固定的魔法方法, 看某種類(lèi)型的數(shù)據(jù)是否支持某種運(yùn)算符就看這個(gè)類(lèi)型中有沒(méi)有實(shí)現(xiàn)對(duì)應(yīng)的魔法方法
例如: + - add
> - gt

class Student:
    def __init__(self, name, age, score=0):
        self.name = name
        self.age = age
        self.score = score

def __repr__(self):
    return '<%s>' % str(self.__dict__)[1:-1]

# +號(hào)對(duì)應(yīng)的魔法方法:實(shí)現(xiàn)兩個(gè)對(duì)象求和

# self + other  ->  self.__add__(other)

# 函數(shù)的返回值就是運(yùn)算結(jié)果

def __add__(self, other):
    print('self:', self.name)
    print('other:', other.name)
    return self.age + other.age

# *號(hào)對(duì)應(yīng)的魔法方法:實(shí)現(xiàn)對(duì)象乘以整數(shù)

def __mul__(self, other):
    return self.age * other

# 注意: >和<只需要重載一個(gè)贱鼻,另外一個(gè)自動(dòng)支持

# self < other

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

stu1 = Student('小明', 19, 90)
stu2 = Student('小胡', 20, 89)

print(stu1 == stu2)   # False

print(stu1 + stu2)     # stu1.__add__(stu2)

# print(stu1 > stu2)

print('abc'*4)

print(stu1 * 2)    # stu1.__mul__(2)

all_student = [
    Student('stu1', 17, 90),
    Student('stu2', 20, 89),
    Student('stu3', 12, 70),
    Student('stu4', 40, 81)
]
print(all_student)

# 問(wèn)題

# all_student.sort()   # TypeError: '<' not supported between instances of 'Student' and 'Student'

# 解決方案一:給key賦值

# all_student.sort(key=lambda item: item.score)

# print(all_student)

# 解決方案二: 重載<運(yùn)算符

# all_student.sort()

# print(all_student)

print(stu1 < stu2)
print(stu1 > stu2)

print(max(all_student))

內(nèi)存管理

手動(dòng)內(nèi)存管理

內(nèi)存分為棧區(qū)間和堆區(qū)間僵朗,棧區(qū)間中的內(nèi)存是自動(dòng)開(kāi)辟自動(dòng)釋放; 堆上的內(nèi)存需要程序員寫(xiě)代碼申請(qǐng)和釋放

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

python中所有的類(lèi)型就是類(lèi),所以所有的數(shù)據(jù)都是對(duì)象捏悬。對(duì)象都是保存在堆區(qū)間撞蚕;變量是保存在棧區(qū)間,
變量中實(shí)際存儲(chǔ)的是堆中存儲(chǔ)的數(shù)據(jù)的地址过牙。(變量的本質(zhì)就是指針)

注意: 除了數(shù)字和字符串對(duì)象甥厦,其他的數(shù)據(jù)都是每次需要數(shù)據(jù)的時(shí)候直接在堆中開(kāi)辟空間。
數(shù)字和字符串會(huì)先檢查這個(gè)數(shù)據(jù)之前是否保存過(guò)寇钉,如果保存過(guò)就直接用之前的數(shù)據(jù),否則才開(kāi)辟新的內(nèi)存空間

from sys import getrefcount
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(id(list1), id(list2))

list3 = list2

num1 = '100'
num2 = '100'
print(id(num1), id(num2))

num1 = 2**1999
num2 = 2**1999
print(id(num1), id(num2))

# def change(x, y):

# temp = x

# x = y

# y = temp

#
#

# a = 10

# b = 20

# change(a, b)

# print(a, b)

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

python中內(nèi)存的釋放采用的是'垃圾回收機(jī)制'自動(dòng)釋放

a.垃圾回收機(jī)制: 1)看一個(gè)數(shù)據(jù)是否需要銷(xiāo)毀(是否需要回收)刀疙,就看這個(gè)對(duì)象的引用計(jì)數(shù)是否為0(引用:保存對(duì)象地址的數(shù)據(jù))。
2)如果這個(gè)對(duì)象的引用計(jì)數(shù)不為零就假設(shè)當(dāng)前對(duì)象消失摧莽,然后看會(huì)不會(huì)有其他對(duì)象因?yàn)樗南б糜?jì)數(shù)變成0庙洼,
如果有,就將另外一個(gè)對(duì)象回收(循環(huán)引用解環(huán))

注意: 用一個(gè)變量給另外一個(gè)變量賦值镊辕,實(shí)質(zhì)賦的是地址

list1 = [10, 20, 30]
print(getrefcount(list1))

list2 = list1
print(getrefcount(list1))

# def yt_getrefcount(obj):

# # obj = list1

# print('獲取obj的引用次數(shù)')

#

# print(yt_getrefcount(list1))

num = 100
print(getrefcount(num))

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.dog = None

class Dog:
    def __init__(self, name, age, color):
        self.name = name
        self.age = age
        self.color = color
        self.owner = None

p1 = Person('小明', 18)
dog1 = Dog('財(cái)財(cái)', 3, '黃色')
p1.dog = dog1
dog1.owner = p1

del p1
del dog1
# 面試題:== 和 is的區(qū)別?

# 補(bǔ)充: is的使用 - 判斷兩個(gè)數(shù)據(jù)的地址是否一樣

list1 = [1, 2, 3]
list2 = [1, 2, 3]
list3 = list1
print(list1 == list2, list1 == list3)   # True, True
print(list1 is list2, list1 is list3)   # False, True

深拷貝和淺拷貝

import copy

class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        self.dog = None

def __repr__(self):
    return '<%s>' % str(self.__dict__)[1:-1]

class Dog:
    def __init__(self, name, color):
        self.name = name
        self.color = color

def __repr__(self):
    return '<%s>' % str(self.__dict__)[1:-1]

使用變量的三種情況:

1.直接賦值 - 賦的是地址油够,賦完值兩個(gè)變量一模一樣

變量1 = 變量2

list1 = [1, 2, 3]
list2 = list1

list1.append(10)
print(list1)   # [1, 2, 3, 10]
print(list2)   # [1, 2, 3, 10]

2.淺拷貝

列表[:]、列表.copy()征懈、copy.copy(數(shù)據(jù))

淺拷貝: 直接復(fù)制被拷貝的數(shù)據(jù)產(chǎn)生一個(gè)新的地址石咬,將新的地址賦給變量; 如果被拷貝的對(duì)象中有子對(duì)象,子對(duì)象不會(huì)被復(fù)制

p1 = Person('小明', 18, '男')
p1.dog = Dog('大黃', '黃色')

# p2 = p1

print('============淺拷貝==============')
p2 = copy.copy(p1)
p2.name = 'Tom'
p2.dog.color = '褐色'
print(p1)    # <'name': '小明', 'age': 18, 'gender': '男'>
print(p2)    # <'name': 'Tom', 'age': 18, 'gender': '男'>

3.深拷貝

copy.deepcopy(數(shù)據(jù))
深拷貝: 直接復(fù)制被拷貝的數(shù)據(jù)產(chǎn)生一個(gè)新的地址卖哎,將新的地址賦給變量; 如果被拷貝的對(duì)象中有子對(duì)象鬼悠,子對(duì)象也會(huì)被復(fù)制

print('============深拷貝==============')
p1 = Person('小明', 18, '男')
p1.dog = Dog('大黃', '黃色')
p3 = copy.deepcopy(p1)

p3.name = '小花'
p3.gender = '女'
p3.dog.color = '紅色'

print(p1)
print(p3)

a = 10
b = 257
c1 = 257

def te():
    c = 10
    d = 257
    print(a is c)
    print(b is d)
    print(id(a),id(b),id(c),id(d))

te()
print(id(c1), id(b))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市亏娜,隨后出現(xiàn)的幾起案子焕窝,更是在濱河造成了極大的恐慌,老刑警劉巖维贺,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件它掂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡溯泣,警方通過(guò)查閱死者的電腦和手機(jī)虐秋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)垃沦,“玉大人客给,你說(shuō)我怎么就攤上這事≈荆” “怎么了靶剑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵蜻拨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抬虽,道長(zhǎng)官觅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任阐污,我火速辦了婚禮休涤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笛辟。我一直安慰自己功氨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布手幢。 她就那樣靜靜地躺著捷凄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪围来。 梳的紋絲不亂的頭發(fā)上跺涤,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音监透,去河邊找鬼桶错。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胀蛮,可吹牛的內(nèi)容都是我干的院刁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼粪狼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼退腥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起再榄,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狡刘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后困鸥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嗅蔬,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年窝革,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了购城。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吕座。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虐译,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吴趴,到底是詐尸還是另有隱情漆诽,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站厢拭,受9級(jí)特大地震影響兰英,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜供鸠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一畦贸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧楞捂,春花似錦薄坏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至繁堡,卻和暖如春沈善,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椭蹄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工闻牡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塑娇。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓澈侠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親埋酬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哨啃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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