重寫
a.完全重寫:重新實現(xiàn)從父類繼承下來的方法枣察,重寫后隘马,子類再調(diào)用這個方法的時候,就調(diào)用自己的方法
b.保留父類實現(xiàn)的功能揭朝,再添加新的功能
對象和類調(diào)用方法的過程:先看當(dāng)前類是否存在這個方法庐舟,沒有才看父類有沒有這個方法欣除,依次向上尋找,尋找祖宗十八代挪略,直到基類(object)為止
class Animal:
number = 100
def __init__(self):
self.age = 0
self.color = ''
def eat(self):
print('吃東西')
def shout(self):
print('叫喚')
@classmethod
def get_number(cls):
return cls.number
class Dog(Animal):
# 完全重寫
def shout(self):
print('??汪汪汪')
#
def eat(self):
super().eat()
print('吃屎')
@classmethod
def get_number(cls):
print(super().get_number())
if __name__ == '__main__':
dog1 = Dog()
dog1.shout()
dog1.eat()
dog1.get_number()
添加屬性
對象屬性的繼承:是通過init方法來繼承對象屬性的
給當(dāng)前類添加對象屬性:重寫init方法
注意:如果要保留父類的對象屬性历帚,需要使用super()去調(diào)用父類的init方法
多態(tài):因為可以重寫,所以存在多態(tài)杠娱。因為重寫的時候挽牢,可以給出不同的內(nèi)容
所以同一種方法在不同的類中可以有多重形態(tài)
類的多態(tài):繼承產(chǎn)生多態(tài)
class Person:
def __init__(self, name, age=0):
self.name = name
self.age = age
class Staff(Person):
def __init__(self, name, age=0, salary=0):
super().__init__(name, age)
self.salary = salary
if __name__ == '__main__':
s1 = Staff('張三', 21, 20000)
print(s1.name)
print(s1.salary)
運算符的重載
方法的重載:一個類中可以有多個名字相同的方法,但是參數(shù)不一樣墨辛,就叫重載卓研。python中不支持
(后面的方法會把前面的方法覆蓋)
運算符重載:重新定義運算符運算的過程
趴俘、<
大于和小于符號只需要重載其中的一個睹簇,另外一個的結(jié)果直接說重載的結(jié)果取反奏赘。
+、-
class Student:
def __init__(self, name='', age=0, height=0):
self.name = name
self.age = age
self.height = height
# 重載:>
def __gt__(self, other):
return self.height > other.height
# 重載:<
def __lt__(self, other):
return self.age < other.age
# 重載:+
def __add__(self, other):
return self.height + other.height
# 重載:-
def __sub__(self, other):
return self.age - other.age
if __name__ == '__main__':
stu1 = Student('a', 18, 170)
stu2 = Student('b', 15, 165)
print(stu1 > stu2)
print(stu1 < stu2)
內(nèi)存管理
內(nèi)存中有兩個特殊的區(qū)域:堆太惠、棧
棧:棧中的內(nèi)存是系統(tǒng)自動管理(內(nèi)存的開辟和內(nèi)存的釋放)
堆:堆中的內(nèi)存都需要寫程序去開辟和釋放(python中這個過程也已經(jīng)自動化)
原理?:堆中的數(shù)據(jù)到底是什么時候釋放的?
看一個值有幾個引用磨淌,當(dāng)一個值沒有被引用,值對應(yīng)的內(nèi)存空間就會被釋放
(引用計數(shù)機制)
引用:存儲對象地址的變量
注意:將對象添加到容器中凿渊,對象的引用會加1
包的使用
封裝:
對一個功能的封裝 --> 用函數(shù)
對多個功能進行封裝 --> 模塊和類
對多個數(shù)據(jù)進行封裝 --> 類梁只、字典
對多個類進行封裝 --> 模塊
對多個模塊進行封裝 --> 包