August 2 -day 15-Python面向?qū)ο?

重寫(xiě)

  • 繼承后墓造,子類可以擁有除父類繼承的內(nèi)容以外的其他的內(nèi)容
  1. 關(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)算符的重載

  1. 重載:一個(gè)類中可以有多個(gè)名字相同的方法,但是參數(shù)不一樣亚兄,就叫重載混稽。python中不支持
  2. 運(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è)

  1. 定義一個(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
  1. 建立一個(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)蓮花

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子握截,更是在濱河造成了極大的恐慌飞崖,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谨胞,死亡現(xiàn)場(chǎng)離奇詭異固歪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)胯努,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)牢裳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人叶沛,你說(shuō)我怎么就攤上這事蒲讯。” “怎么了灰署?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵判帮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我溉箕,道長(zhǎng)晦墙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任约巷,我火速辦了婚禮偎痛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘独郎。我一直安慰自己踩麦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布氓癌。 她就那樣靜靜地躺著谓谦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贪婉。 梳的紋絲不亂的頭發(fā)上反粥,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音疲迂,去河邊找鬼才顿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尤蒿,可吹牛的內(nèi)容都是我干的郑气。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腰池,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尾组!你這毒婦竟也來(lái)了忙芒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤讳侨,失蹤者是張志新(化名)和其女友劉穎呵萨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體跨跨,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潮峦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歹叮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跑杭。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咆耿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爹橱,我是刑警寧澤萨螺,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站愧驱,受9級(jí)特大地震影響慰技,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜组砚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一吻商、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糟红,春花似錦艾帐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至事扭,卻和暖如春捎稚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背求橄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工今野, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罐农。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓条霜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親啃匿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛔外,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容