python的類支持多繼承(讓一個類同時繼承多個類);多繼承的時候挡闰,子類只能繼承第一個父類所有的屬性和方法乒融,后面的父類只有字段
和方法能被繼承
class Animal:
num = 100
def __init__(self):
self.age = 0
self.gender = 'male'
@classmethod
def func1(cls):
print('動物類的類方法')
class Fly:
name = '飛行'
def __init__(self):
self.height = 100
self.time = 3
self.speed = 80
def func2(self):
print('飛行的對象方法')
class Bird(Animal, Fly):
pass
b = Bird()
print(Bird.num, Bird.name)
# print(Bird.age, Bird.time)
Bird.func1()
print(b.age, b.gender)
# print(b.height)
python中所有的類型都是類,所以所有的數(shù)據(jù)都是對象
python中使用任意的運算符都是在調(diào)用相應(yīng)類中的對應(yīng)的方法摄悯,每一個運算符對應(yīng)的什么方法是固定的
某種數(shù)據(jù)是否支持某個運算符操作就看這個數(shù)據(jù)類型中是否實現(xiàn)了對應(yīng)的方法
1赞季、運算符重載指的是在不同的類中實現(xiàn)同樣的函數(shù)的運算符對應(yīng)的函數(shù)
類的對象默認(rèn)情況下只支持==, !=
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
# a+b --> a.__add__(b)
# self --> 當(dāng)前類的對象,也是+前面的那個數(shù)據(jù)
# other --> +后面的那個數(shù)據(jù)奢驯,類型根據(jù)運算規(guī)則的設(shè)計可以是任何類型的數(shù)據(jù)
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
def __add__(self, other):
# return self.age + other.age
return Student(self.name + other.name, self.age + other.age, self.score + other.score)
# 注意:<,>符號只需要重載其中一個就可以
def __lt__(self, other):
return self.score < other.score
stu1 = Student('小明', 22, 77)
stu2 = Student('小紅', 19, 88)
print(stu1 + stu2)
print(stu1 < stu2)
淺拷貝和深拷貝
1申钩、直接賦值
將變量中的地址直接賦給新的變量,賦值后兩個變量的地址相同
2瘪阁、拷貝
不管是淺拷貝還是深拷貝都會對原數(shù)據(jù)進(jìn)行賦值產(chǎn)生新的地址
3撒遣、淺拷貝
字符串、列表和元組的切片管跺;對象.copy()义黎;copy模塊中的copy方法都是淺拷貝
淺拷貝指當(dāng)前對象,不會對子對象進(jìn)行拷貝
4豁跑、深拷貝
copy模塊中的deepcopy方法是深拷貝
# 練習(xí)
from copy import copy, deepcopy
a = ['color', 'height', 'background']
b = [a, 'aaa', 'bbb']
c1 = b
c2 = copy(b)
c3 = deepcopy(b)
a[-1] = ['BG']
b.append('ccc')
# 問題:print(c1), print(c3), print(c3)
print(c1)
print(c2)
print(c3)
from enum import Enum
枚舉的特點:
1廉涕、可以通過有意義的屬性名直接顯示數(shù)據(jù)
2、每個數(shù)據(jù)的值不能修改
3艇拍、有時候可以做到不同數(shù)據(jù)的值是唯一的
內(nèi)存的開辟
內(nèi)存區(qū)間分為棧區(qū)間和堆區(qū)間狐蜕;棧區(qū)間的內(nèi)存自動開辟和自動釋放,堆區(qū)間的內(nèi)存需要程序員手動開辟和釋放卸夕;
但是python已經(jīng)將堆區(qū)間內(nèi)存的開辟和釋放自動化
當(dāng)每次給變量賦值的時候层释,系統(tǒng)先在堆區(qū)間中開辟空間將數(shù)據(jù)存起來,然后再將數(shù)據(jù)在堆中的地址存到變量中娇哆,變量存在堆區(qū)間
數(shù)字和字符串?dāng)?shù)據(jù)在開辟空間的時候,會先檢查內(nèi)存中之前是否已經(jīng)有這個數(shù)據(jù),如果有直接使用之前的數(shù)據(jù)碍讨,沒有才開辟新的空間保存數(shù)據(jù)
內(nèi)存的釋放
棧區(qū)間:全局棧區(qū)間在程序結(jié)束后銷毀治力,函數(shù)棧區(qū)間在函數(shù)調(diào)用結(jié)束后銷毀(自動)
堆區(qū)間:看一個對象是否銷毀,就看這個對象的引用計數(shù)是否為0勃黍,如果一個對象的引用為0宵统,這個對象就銷毀(垃圾回收機制)
注意:python中針對對象的循環(huán)引用已經(jīng)做了處理,程序員不需要寫額外的代碼來解決循環(huán)引起的問題