重寫(xiě)
- 繼承后墓造,子類可以擁有除父類繼承的內(nèi)容以外的其他的內(nèi)容
- 關(guān)于方法
1).在子類中可以直接添加其他的方法
2).重寫(xiě):
a.完全重寫(xiě)
重新實(shí)現(xiàn)從父類繼承下來(lái)的方法媒区,重寫(xiě)后,子類再調(diào)用這個(gè)方法的時(shí)候已脓,就調(diào)用子類的
b.保留父類實(shí)現(xiàn)的功能珊楼,再添加新的功能
- 對(duì)象和類調(diào)用方法的過(guò)程:先看當(dāng)前類是否存在這個(gè)方法,沒(méi)有才看父類有沒(méi)有這個(gè)方法度液;
如果父類沒(méi)有就看父類的父類有沒(méi)有厕宗,直到找到基類(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('看家')
# 重寫(xiě)父類的shout
def shout(self):
print('汪汪汪~(yú)')
# 重寫(xiě)父類eat方法
def eat(self):
# 保留父類eat的功能
super().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()
結(jié)果:
汪汪汪~(yú)
看家
吃東西
吃骨頭
吃東西
100
子類中添加屬性
對(duì)象屬性的繼承:是通過(guò)繼承init方法來(lái)繼承的對(duì)象屬性
給當(dāng)前類添加對(duì)象屬性: 重寫(xiě)init方法已慢。
注意:如果要保留父類的對(duì)象屬性,需要使用super()去調(diào)用父類的init方法
多態(tài):同一個(gè)事物有多種形態(tài)霹购。
方法的多態(tài):子類繼承父類的方法佑惠,可以對(duì)方法進(jìn)行重寫(xiě),一個(gè)方法就有多種形態(tài)(多態(tài)的表現(xiàn))
類的多態(tài):繼承產(chǎn)生多態(tài)
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 = salary
def eat(self):
print('員工在吃飯')
class Scientist(Person):
def eat(self):
print('科學(xué)家在吃飯')
if __name__ == '__main__':
p1 = Person('李四',sex='女')
p1.eat()
s1 = Staff(age=18)
s1.sex = '男'
print(s1.name)
s1.salary = 10000
print(s1.salary)
s1.eat()
結(jié)果:
人在吃飯
10000
員工在吃飯
練習(xí):
- 聲明人類,有屬性膜楷,名字旭咽、年齡、性別赌厅、身高
要求創(chuàng)建人的對(duì)象的時(shí)候可以給名字穷绵、性別、年齡賦初值
再創(chuàng)建學(xué)生類繼承自人類特愿,擁有人類的所有的屬性仲墨,再添加學(xué)號(hào)、成績(jī)揍障、電話屬性
要求創(chuàng)建學(xué)生對(duì)象的時(shí)候可以給名字目养、年齡和電話賦初值
class Person2:
"""人類"""
a = 10
def __init__(self, name, sex, age):
self.name = name
self.age = age
self.sex = sex
self.height = 0
class Student(Person2):
"""學(xué)生類"""
b = 100
def __init__(self, name='', age=0, tel='00'):
super().__init__(name, age=age, sex='女')
self.study_id = '00'
self.score = 0
self.tel = tel
stu = Student('李四')
stu.sex = '男'
print(stu.age)
p1 = Person2('張三', '男', 18)
結(jié)果:
0
運(yùn)算符的重載
- 重載:一個(gè)類中可以有多個(gè)名字相同的方法,但是參數(shù)不一樣亚兄,就叫重載混稽。python中不支持
- 運(yùn)算符重載(重新定義運(yùn)算符運(yùn)算的過(guò)程)
>、<审胚、+匈勋、-
大于和小于符號(hào)只需要重載其中的一個(gè),另外一個(gè)的結(jié)果膳叨,直接是重的結(jié)果取反
class Student:
# python不支持方法的重載
# def run(self):
# print('人在跑')
def run(self, name):
print('%s在跑' % name)
class Student2:
def __init__(self, name='', age=0, height=0):
self.name = name
self.age = age
self.height = height
# 重載: >
"""
self > other
"""
def __gt__(self, other):
# 比較對(duì)象1>對(duì)象2的時(shí)候是比較的他們的height屬性
return self.height > other.height
# return self.age > other.age
# return id(self) > id(other)
# 重載:<
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__':
stu = Student()
stu.run('人')
stu1 = Student2('aa', 18, height=170)
stu2 = Student2('bb', 20, height=140)
if stu1 > stu2:
print('學(xué)生1大于學(xué)生2啊啊')
if stu1 < stu2:
print('學(xué)生1大于學(xué)生2')
else:
print('學(xué)生2小于學(xué)生1')
print(stu1 + stu2)
print(stu1-stu2)
print(100+200)
print('abc'+'abc')
結(jié)果:
人在跑
學(xué)生1大于學(xué)生2啊啊
學(xué)生1大于學(xué)生2
38
30
300
abcabc
內(nèi)存管理
python內(nèi)存管理原理
內(nèi)存中有兩個(gè)特殊的區(qū)域:棧洽洁、堆
棧:棧中的內(nèi)存是系統(tǒng)自動(dòng)管理(內(nèi)存的開(kāi)辟和內(nèi)存的釋放) --- 作用域結(jié)束,內(nèi)存就釋放
堆:堆中的內(nèi)存都需要寫(xiě)程序去開(kāi)辟和釋放的(python中這個(gè)過(guò)程也已經(jīng)自動(dòng)化)原理菲嘴?:堆中的數(shù)據(jù)到底是什么時(shí)候釋放的饿自?
看一個(gè)對(duì)象有幾個(gè)引用,當(dāng)一個(gè)對(duì)象沒(méi)有引用的時(shí)候龄坪,對(duì)象對(duì)應(yīng)的內(nèi)存空間就會(huì)被釋放
(引用計(jì)數(shù)機(jī)制)
引用:存儲(chǔ)對(duì)象地址的變量一旦計(jì)數(shù)機(jī)制為0昭雌,堆的數(shù)據(jù)就會(huì)釋放,兩個(gè)對(duì)象指向同一地址健田,刪除其中之一的對(duì)象烛卧,地址還會(huì)保留,可以再聲明變量來(lái)覆蓋已聲明過(guò)的對(duì)象妓局,已聲明的地址會(huì)被釋放总放。
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()
lists[0] = None
結(jié)果:
p 人在跑
p1 人在跑
p3 人在跑
包的使用
封裝:
對(duì)一個(gè)功能的封裝 --> 用函數(shù)
對(duì)多個(gè)功能的封裝 --> 模塊和類
對(duì)多個(gè)數(shù)據(jù)進(jìn)行封裝 --> 類存炮、字典
對(duì)多個(gè)類進(jìn)行封裝 ---> 模塊
對(duì)多個(gè)模塊進(jìn)行封裝 ---> 包(文件夾)導(dǎo)入某個(gè)包中的某個(gè)模塊
from package1 import my_math導(dǎo)入某個(gè)包的某個(gè)模塊中的某個(gè)函數(shù)和類
from package1.my_math import sum,Math
作業(yè)
- 定義一個(gè)學(xué)生類炬搭。有屬性:姓名蜈漓、年年齡、成績(jī)(語(yǔ)文尚蝌,數(shù)學(xué)迎变,英語(yǔ))[每課成績(jī)的類型為整數(shù)]
方法: a. 獲取學(xué)生的姓名:getname() b. 獲取學(xué)生的年年齡:getage()
c. 返回3門(mén)科目中最高的分?jǐn)?shù)充尉。get_course()
class Student:
def __init__(self, name, age,math=0,english=0, chinese=0):
self.name = name
self.age = age
self.score = []
self.score.append(math)
self.score.append(english)
self.score.append(chinese)
def get_name(self):
print('這個(gè)學(xué)生叫做:%s'%self.name)
def get_age(self):
print('這個(gè)學(xué)生有%s歲' % self.age)
def get_course(self):
return max(self.score)
stu1 = Student('孝利', 23, math=80, english=66, chinese=98)
stu1.get_name()
stu1.get_age()
print(stu1.get_course()
結(jié)果:
這個(gè)學(xué)生叫做:孝利
這個(gè)學(xué)生有23歲
98
- 建立一個(gè)汽車類Auto飘言,包括輪胎個(gè)數(shù),汽車顏色驼侠,車身重量量姿鸿,速度等成員變量量,并通過(guò)不不同的構(gòu)造方法創(chuàng)建實(shí)例倒源。至少要求 汽車能夠加速 減速停車苛预。再定義一個(gè)小汽車類CarAuto 繼承Auto并添加空調(diào)、CD等成員變量量 覆蓋加速減速的方法
class Auto:
def __init__(self):
self.tyre = 0
self.color = ''
self.weight = 0
self.speed = 0
def speed_up(self):
print('加速')
def speed_cut(self):
print('減速')
def stop(self):
print('停車')
class CarAuto(Auto):
def __init__(self, air_conditioner, CD):
super().__init__()
self.air_conditioner = air_conditioner
self.CD = CD
def speed_cut(self):
print('電動(dòng)車減速')
def stop(self):
print('電動(dòng)車停車')
c1 = CarAuto('美的', '需要人陪')
c1.speed_cut()
結(jié)果:
電動(dòng)車減速
3.創(chuàng)建一個(gè)名為User 的類笋熬,其中包含屬性firstname 和lastname 热某,還有用戶簡(jiǎn)介通常會(huì)存儲(chǔ)的其他幾個(gè)屬性。在類User 中定義一個(gè)名 為describeuser() 的方法胳螟,它打印用戶信息摘要昔馋;再定義一個(gè)名為greetuser() 的方法,它向用戶發(fā)出個(gè)性化的問(wèn)候糖耸。
管理理員是一種特殊的用戶秘遏。編寫(xiě)一個(gè)名為Admin 的類,讓它繼承User類嘉竟。添加一個(gè)名為privileges 的屬性邦危,用于存儲(chǔ)一個(gè)由字符串串(如"can add post"、"can delete post"舍扰、"can ban user"等)組成的列列表倦蚪。編寫(xiě)一個(gè)名為show_privileges()的方法,它顯示管理理員的權(quán)限边苹。創(chuàng)建一個(gè)Admin 實(shí)例例陵且,并調(diào)用這個(gè)方法。
class User:
def __init__(self,first_name,ast_name,E_mail,tel):
self.first_name = first_name
self.ast_name = ast_name
self.E_mail = E_mail
self.tel = tel
def describe_user(self):
print('名字:%s%s 郵箱:%s 電話:%s'%(self.ast_name,self.first_name,self.E_mail,self.tel))
def greet_user(self):
print('喲喲勾给,%s%s,你好滩报!'%(self.ast_name,self.first_name))
u1 = User('福貴','王','@126.com','110')
u1.describe_user()
u1.greet_user()
class Admin(User):
def __init__(self):
super().__init__(first_name='',ast_name='',E_mail='',tel='')
self.privileges = []
def show_privileges(self):
print(self.privileges)
a1 = Admin()
a1.privileges = ['can add post','can delete post','can ban user']
a1.show_privileges()
結(jié)果:
名字:王福貴 郵箱:@126.com 電話:110
喲喲,王福貴,你好播急!
['can add post', 'can delete post', 'can ban user']
4.創(chuàng)建一個(gè)Person類脓钾,添加一個(gè)類字段用來(lái)統(tǒng)計(jì)Perosn類的對(duì)象的個(gè)數(shù)
class Person:
number = 0
def __init__(self):
self.name = ''
self.sum1()
@classmethod
def sum1(cls):
cls.number += 1
p1 = Person()
P2 = Person()
p3 = Person()
print(Person.number)
結(jié)果:
3
(嘗試)5.寫(xiě)一個(gè)類,其功能是:1.解析指定的歌詞文件的內(nèi)容 2.按時(shí)間顯示歌詞提示:歌詞文件的內(nèi)容一般是按下面的格式進(jìn)行行存儲(chǔ)的桩警。歌詞前面對(duì)應(yīng)的是時(shí)間可训,在對(duì)應(yīng)的時(shí)間點(diǎn)可以顯示對(duì)應(yīng)的歌詞
[00:00.20]藍(lán)蓮花
[00:00.80]沒(méi)有什什么能夠阻擋
[00:06.53]你對(duì)自由地向往
[00:11.59]天馬行行空的生涯
[00:16.53]你的心了了無(wú)牽掛
[02:11.27][01:50.22][00:21.95]穿過(guò)幽暗地歲月
[02:16.51][01:55.46][00:26.83]也曾感到彷徨
[02:21.81][02:00.60][00:32.30]當(dāng)你低頭地瞬間
[02:26.79][02:05.72][00:37.16]才發(fā)覺(jué)腳下的路路
[02:32.17][00:42.69]心中那自由地世界
[02:37.20][00:47.58]如此的清澈高遠(yuǎn)
[02:42.32][00:52.72]盛開(kāi)著永不不凋零
[02:47.83][00:57.47]藍(lán)蓮花