01-重寫
繼承后,子類可以擁有除父類繼承的內(nèi)容以外的其他的內(nèi)容
-
1.關于方法
- 1).在子類中可以直接添加其他的方法
- 2).重寫:
- a.完全重寫
重新實現(xiàn)從父類繼承下來的方法锥债,重寫后玖瘸,子類再調(diào)用這個方法的時候驾窟,就調(diào)用子類的 - b.保留父類實現(xiàn)的功能比驻,再添加新的功能
- a.完全重寫
-
對象和類調(diào)用方法的過程:
先看當前類是否存在這個方法该溯,沒有才看父類有沒有這個方法岛抄;
如果父類沒有就看父類的父類有沒有,直到找到基類(object)為止
class Animal(object):
"""動物類"""
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):
# 保留父類的類方法的功能的時候朗伶,還是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方法來繼承的對象屬性
給當前類添加對象屬性: 重寫init方法。
注意:如果要保留父類的對象屬性论皆,需要使用super()去調(diào)用父類的init方法多態(tài):同一個事物有多種形態(tài)。
方法的多態(tài):子類繼承父類的方法猾漫,可以對方法進行重寫点晴,一個方法就有多種形態(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)建對象的時候就可以給某些屬性賦值
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('科學家在吃飯')
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()
# 練習:
"""
聲明人類,有屬性悯周,名字粒督、年齡、性別禽翼、身高
要求創(chuàng)建人的對象的時候可以給名字屠橄、性別、年齡賦初值
再創(chuàng)建學生類繼承自人類闰挡,擁有人類的所有的屬性锐墙,再添加學號、成績长酗、電話屬性
要求創(chuàng)建學生對象的時候可以給名字溪北、年齡和電話賦初值
"""
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):
"""學生類"""
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-運算符的重載
-
重載:
- 一個類中可以有多個名字相同的方法,但是參數(shù)不一樣,就叫做重載.python中不支持重載
class Student:
# def run(self):
# print('run')
def run(self,name):
print("%s ran" % name)
"""
2.運算符重載(重新定義運算符運算的過程)
<,>
大于和小于符號只需要重載其中的一個,另一個的結(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的時候是比較他們的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)存中有兩個特殊的區(qū)域:棧,堆
- 棧:棧中的內(nèi)存是系統(tǒng)自動管理的(內(nèi)存的開辟和釋放) --- 作用域結(jié)束,內(nèi)存就釋放
- 堆:堆中的內(nèi)存都是需要寫程序去開辟和釋放的(python中這個過程已經(jīng)自動化了)
原理:堆中的數(shù)據(jù)到底是什么時候釋放的?
看一個對象有幾個引用,當一個值沒有引用的時候,對象對應的內(nèi)存空間就會被釋放
(引用計數(shù)機制)
引用:存儲對象地址的變量