Day14 面向?qū)ο蠡A(chǔ)3

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ù)名或者類名

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容