01.重寫
02.添加屬性
03.運(yùn)算符的重載
04.python 中的內(nèi)存管理
05.包的使用
01.重寫
- 繼承后,子類可以擁有除父類繼承的內(nèi)容以外的其他內(nèi)容
1.關(guān)于方法
1).在子類中可以直接添加其他的方法
2).重寫:
- a.完全重寫
重新實(shí)現(xiàn)從父類繼承下來的方法,重寫后,子類再調(diào)用這個(gè)方法的時(shí)候,就調(diào)用子類的方法 - b.保留父類實(shí)現(xiàn)的功能,再添加新的功能
對(duì)象和類調(diào)用方法的過程:先看當(dāng)前類是否存在這個(gè)方法,沒有才看父類有沒有這個(gè)方法,
如果父類沒有,就看父類的父類,直到找到基類(object)為止
class Animal(object):
'''動(dòng)物類'''
def __init__(self):
self.age = 0
self.color = ''
def eat(self):
print('吃東西')
def shout(self):
print('叫喚')
@classmethod
def get_number(cls):
return 100
class Dog(Animal):
'''狗類'''
def look_after(self):
print('看家')
# 重寫父類的shout
def shout(self):
print('汪汪汪~')
# 重寫父類eat方法
def eat(self):
super().eat() #保留父類eat的功能
print('吃骨頭')
@classmethod
def get_number(cls):
# 保留父類額類方法的功能的時(shí)候,還有super()的功能
print(super().get_number())
if __name__ == '__main__':
dog = Dog()
dog.age = 3
print(dog.color)
dog.shout()
dog.look_after()
dog.eat()
an = Animal()
# 繼承后,父類不能使用在子類中添加的屬性和方法
# an.look_after()
an.eat()
Dog.get_number()

02.添加屬性
對(duì)象屬性的繼承:是通過繼承init方法來繼承的對(duì)象屬性
給當(dāng)前類添加對(duì)象屬性:重寫init方法。
注意:如果要保留父類的對(duì)象屬性,要使用super()去調(diào)用父類的init方法多態(tài):同一個(gè)事物有多種形態(tài)。子類繼承父類的方法,可以對(duì)方法進(jìn)行重寫,一個(gè)方法就有多種形態(tài)(多態(tài)的表現(xiàn))
class Person(object):
'''人類'''
def __init__(self,name,age=0,sex=''):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print('人在吃飯')
class Staff(Person):
# init方法的參數(shù):保證在創(chuàng)建對(duì)象的時(shí)候就可以給某些屬性賦值
def __init__(self,name='',age=0,salary=0):
super().__init__(name,age)
self.salary = 0
def eat(self):
print('人在吃飯')
if __name__ == '__main__':
s1 = Staff('張三',10)
print(s1.name)
s1.salary = 10000
print(s1.salary)

練習(xí)
'''
聲明人來,有屬性:名字、年齡、性別、身高
要求創(chuàng)建人的對(duì)象的時(shí)候可以給名字和性別、年齡賦初值
再創(chuàng)建學(xué)生類繼承自人類,擁有人類的所有的屬性,再添加學(xué)號(hào)、成績(jī)、電話屬性
要求創(chuàng)建學(xué)生對(duì)象的時(shí)候,可以給名字、年齡和電話賦初值
'''
class Person2(object):
def __init__(self,name,age=18,sex='男'):
self.name = name
self.age = age
self.sex = sex
self.lenth = 0
class Student(Person2):
def __init__(self,name,age=0,tel='00'):
super().__init__(name,age)
self.stu_id = '00'
self.score = 0
self.tel = tel
stu = Student('張三')
print(stu.age)

03.運(yùn)算符的重載
1.重載:一個(gè)類中可以有多個(gè)名字相同的方法,但是參數(shù)不一樣,就叫重載。python中不支持
2.運(yùn)算符重載(重新定義運(yùn)算符運(yùn)算的過程)
’ > , <,+,-
大于和小于符號(hào)只需要重載其中的一個(gè),另外一個(gè)的結(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):
# 比較對(duì)象1>比較對(duì)象2的時(shí)候就是比較他們的height屬性
return self.height > other.height
# 重載: <
def __lt__(self, other):
return self.age < other.age
# 重載: +
def __add__(self, other):
return self.age + other.age
# 重載: -
def __sub__(self, other):
return self.height - other.height
if __name__ == '__main__':
stu1 = Student('aa',18,height=170)
stu2 = Student('bb',10,height=140)
if stu1 > stu2:
print('學(xué)生1大于學(xué)生2')
if stu1 < stu2:
print('學(xué)生1小于學(xué)生2')
else:
print('學(xué)生1大于學(xué)生2')
print(stu1+stu2)
print(stu1-stu2)

04.python 中的內(nèi)存管理
python內(nèi)存管理原理
內(nèi)存中有兩個(gè)特殊的區(qū)域:棧、堆
棧:棧中的內(nèi)存是系統(tǒng)自動(dòng)管理的(內(nèi)存的開辟和內(nèi)存的釋放) --- 作用域結(jié)束,內(nèi)存就是放
堆:堆中的內(nèi)存都需要寫程序去開辟和釋放的(python中這個(gè)過程也已經(jīng)自動(dòng)化了)
原理:堆中的數(shù)據(jù)到底是什么時(shí)候釋放的?
看一個(gè)對(duì)象有幾個(gè)引用,當(dāng)一個(gè)對(duì)象沒有引用的時(shí)候,對(duì)象對(duì)應(yīng)的內(nèi)存空間就會(huì)被釋放
(引用計(jì)數(shù)機(jī)制)
引用:存儲(chǔ)對(duì)象地址的變量
class Person:
def __init__(self, name):
self.name = name
def run(self):
print(self.name,'人在跑')
if __name__ == '__main__':
# 聲明了一個(gè)Person對(duì)象,存到p中的
p = Person('p')
p.run()
# 刪除對(duì)象的唯一的引用,對(duì)象就會(huì)被銷毀
del p
# p.run()
# Person對(duì)象(0),name='p1' 0+1+1-1-1
p1 = Person('p1')
p2 = p1
del p2
p1.run()
p1 = 'a'
# 注意:將對(duì)象添加到容器中,對(duì)象的引用會(huì)加1
p3 = Person('p3')
lists = [p3, 100]
del p3
lists[0].run()
# del lists[0]
# del lists
lists[0] = None

05.包的使用
封裝:
對(duì)一個(gè)功能的封裝 --> 函數(shù)
對(duì)多個(gè)功能的封裝 --> 模塊和類
對(duì)數(shù)據(jù)進(jìn)行封裝 --> 類、字典
對(duì)多個(gè)類進(jìn)行封裝 --> 模塊
對(duì)多個(gè)模塊進(jìn)行封裝 --> 包
導(dǎo)入包
import 包名導(dǎo)入某個(gè)包中的某個(gè)模塊
from 包名 import模塊名導(dǎo)入某個(gè)包的某個(gè)模塊中的某個(gè)函數(shù)和類
from 包名.模塊名 import 函數(shù)名或者類名