1.什么是運(yùn)算符重載
python中所有的類型都是類惭载,所有的數(shù)據(jù)都是類的對象
python中使用運(yùn)算符的時候,實(shí)質(zhì)會去調(diào)用這個運(yùn)算符對應(yīng)的魔法方法;
類的對象是否支持相應(yīng)的運(yùn)算符响巢,就看這個類中有沒有實(shí)現(xiàn)對應(yīng)的魔法方法.
class Animal:
def shout(self):
print('叫喚')
pass
class Dog(Animal):
def shout(self):
print('汪汪')
pass
class Cat(Animal):
def shout(self):
print('喵喵')
pass
class Student:
def __init__(self, name, age=0, score=0):
self.name = name
self.age = age
self.score = score
def __repr__(self):
return str(self.__dict__)
# __add__是+的魔法方法描滔,self代表+前面的數(shù)據(jù),other代碼+后面的數(shù)據(jù)踪古,返回值是運(yùn)算結(jié)果
def __add__(self, other):
# self = stu1, other = stu2
return self.age+other.age
# *的魔法方法
def __mul__(self, other):
stus = []
for _ in range(other):
stus.append(copy.copy(self))
return stus
# >的魔法方法
# 注意: >和<的魔法方法只需要實(shí)現(xiàn)一個含长,另外一個自動支持
def __gt__(self, other):
return self.score > other.score
def main():
stu1 = Student('小明', 20, 80)
stu2 = Student('小花', 18, 90)
# stu1+stu2 --> stu1.__add__(stu2)
print('兩個學(xué)生相加:', stu1 + stu2)
students = stu1*4
students[0].name = '小花'
print(students)
print(stu1 > stu2)
print(stu1 < stu2)
students2 = [stu1, stu2]
students2.sort()
# print(students2)
print(max(students2))
if __name__ == '__main__':
main()
2.內(nèi)存
1.內(nèi)存可以分為棧區(qū)間和堆區(qū)間,棧上的內(nèi)存是系統(tǒng)自動開辟自動釋放伏穆,堆上的內(nèi)存需要手動開辟拘泞、手動釋放。
在python中堆上的內(nèi)存空間會通過python提供的內(nèi)存管理機(jī)制自動管理
2.內(nèi)存管理機(jī)制
1)內(nèi)存開辟
python中所有的變量都是保存在棧區(qū)間的枕扫,并且所有的變量保存的都是數(shù)據(jù)的地址陪腌;所有的對象(數(shù)據(jù))都是保存在堆區(qū)間的。
變量賦值的原理: 先在堆中開辟空間將數(shù)據(jù)存起來,然后再將地址返回給變量(通用)诗鸭;
如果數(shù)據(jù)是數(shù)字或者字符串染簇,會先在內(nèi)存中查看之前是否已經(jīng)存儲過這個輸入,
如果存儲過直接返回之前的地址强岸,沒有存儲過才會開辟空間存數(shù)據(jù)
2)內(nèi)存的釋放(垃圾回收機(jī)制)
python中的每一個對象都有一個默認(rèn)的屬性來保存這個對象的引用計數(shù)锻弓。
(看這個對象的地址被多個變量或者數(shù)據(jù)存儲;如果一個變量存了一個對象的地址请唱,我們就說這個變量是這個對象的引用)
一個對象是否銷毀就看這個對象的引用計數(shù)是否為0弥咪,只要為0就會被銷毀
getrefcount(對象) -> 獲取對象的引用計數(shù)
from sys import getrefcount
def main():
# 1.變量賦值原理
list1 = {'a': 10}
list2 = {'a': 10}
print(id(list1), id(list2))
num1 = 'abc'
num2 = 'abc'
print(id(num1), id(num2))
# 2.引用計數(shù)
list3 = [1, 2, 3]
list4 = list3
print(getrefcount(list3), getrefcount(list4))
list4 = 10
print(getrefcount(list3))
list3 = 100
print(getrefcount(list3))
# def yt_getcount(obj):
# # obj = list3
# return 獲取obj的引用計數(shù)
if __name__ == '__main__':
main()