day14面向?qū)ο?2)

01-重寫

繼承后,子類可以擁有除父類繼承的內(nèi)容以外的其他的內(nèi)容

  • 1.關(guān)于方法
    • 1).在子類中可以直接添加其他的方法
    • 2).重寫:
      • a.完全重寫
        重新實(shí)現(xiàn)從父類繼承下來的方法,重寫后,子類再調(diào)用這個(gè)方法的時(shí)候,就調(diào)用子類的
      • b.保留父類實(shí)現(xiàn)的功能,再添加新的功能
  • 對象和類調(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):
        # 保留父類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é)果:
汪汪汪~
看家
吃東西
吃骨頭
吃東西
100

02-添加屬性

  • 對象屬性的繼承:是通過繼承init方法來繼承的對象屬性

  • 給當(dāng)前類添加對象屬性: 重寫init方法。
    注意:如果要保留父類的對象屬性,需要使用super()去調(diào)用父類的init方法

  • 多態(tài):同一個(gè)事物有多種形態(tài)。

  • 方法的多態(tài):子類繼承父類的方法,可以對方法進(jìn)行重寫,一個(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)建對象的時(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()


# 練習(xí):
"""
聲明人類,有屬性,名字、年齡、性別、身高
要求創(chuàng)建人的對象的時(shí)候可以給名字、性別、年齡賦初值

再創(chuàng)建學(xué)生類繼承自人類,擁有人類的所有的屬性,再添加學(xué)號(hào)、成績、電話屬性
要求創(chuàng)建學(xué)生對象的時(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é)果:
人在吃飯

10000
員工在吃飯
0

03-運(yùn)算符的重載

  • 重載:
    • 一個(gè)類中可以有多個(gè)名字相同的方法,但是參數(shù)不一樣,就叫做重載.python中不支持重載
class Student:

    # def run(self):
    #     print('run')

    def run(self,name):
        print("%s ran" % name)

"""
2.運(yùn)算符重載(重新定義運(yùn)算符運(yùn)算的過程)
<,>
大于和小于符號(hào)只需要重載其中的一個(gè),另一個(gè)的結(jié)果,直接是重載的結(jié)果取反
+,-
"""

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):
        # 比較對象1>對象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



if __name__ == '__main__':
    stu = Student()
    stu.run('King')

    stu1 = Student2('aa', 18, 170)
    stu2 = Student2('bb', 10, 140)

    if stu1 > stu2:
        print('==========')

輸出結(jié)果:
King ran
==========

04-python內(nèi)存管理

  • 內(nèi)存中有兩個(gè)特殊的區(qū)域:棧,堆

    • 棧:棧中的內(nèi)存是系統(tǒng)自動(dòng)管理的(內(nèi)存的開辟和釋放) --- 作用域結(jié)束,內(nèi)存就釋放
    • 堆:堆中的內(nèi)存都是需要寫程序去開辟和釋放的(python中這個(gè)過程已經(jīng)自動(dòng)化了)
  • 原理:堆中的數(shù)據(jù)到底是什么時(shí)候釋放的?
    看一個(gè)對象有幾個(gè)引用,當(dāng)一個(gè)值沒有引用的時(shí)候,對象對應(yīng)的內(nèi)存空間就會(huì)被釋放
    (引用計(jì)數(shù)機(jī)制)
    引用:存儲(chǔ)對象地址的變量

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

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

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