繼承:是面向對象編程最重要的特性之一,例如,我們每個人都從祖輩和父母那里繼承了一些體貌特征,但每個人卻又不同于父母,有自己獨有的一些特性。在面向對象中被繼承的類是父類或基類,新的類稱為子類或派生類。通過繼承不僅可以實現代碼的重用,還可以理順類與類之間的關系。
重寫:父類的成員都會被子類繼承,當父類中某個方法不完全適用子類,就需要在子類中重新父類方法。在子類中如果定義了__init__()方法時,子類是不會自動調用父類的__init__()方法,此時如果不手動添加,運行代碼就會報錯。需要在子類使用super()函數調用父類的__init__()方法,而且必須在首行。
封裝:提高程序安全性,將屬性、類包裝到類中。Python/ target=_blank class=infotextkey>Python 中沒有專門到修飾符用于屬性到私有,如果屬性不希望在類對象外部被訪問,可以使用兩個'_'。
多態:讓具有不同功能的函數可以使用相同的函數名,這樣就可以用一個函數名調用不同內容(功能)的函數。可以理解為一個事物的多種形態。調用同一個函數,傳入不同的參數,實現不同的功能。
代碼中還寫了一些特殊的方法和特殊屬性,可以注意下!!!
'''
封裝: 提高程序安全性,將屬性、類包裝到類中
python 中沒有專門到修飾符用于屬性到私有,如果屬性不希望在類對象外部被訪問,可以使用兩個'_'
'''
class Studen:
def __init__(self,name,age):
self.name = name
self.__age = age #不希望age在外部使用,前面加兩個__
def show(self):
print('nihal',self.name,self.__age)
def __run(self): #私有方法
pass
st = Studen('za',18)
st.show()
print(st.name)
# print(st.age) #不能訪問age,因為age私有,但可以通過下面訪問
print(dir(st)) #可以查看屬性和方法
print(st._Studen__age) #在類但外部可以通過,_Studen__age這種方式訪問
'''
繼承:提高代碼復用性
class 子類名(父類1,父類2,父類3.....):
pass
如果一個類沒有繼承任何一個類,則默認繼承object
【注意】在繼承中,子類但構造函數必須調用父類但構造函數
'''
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def info(self):
print('姓名{0},年齡{1}'.format(self.name,self.age))
class Student(Person):
def __init__(self,name,age,score):
super().__init__(name,age) #子類繼承父類,在構造函數中必須用super調用父類構造函數
self.score = score
def run(self):
print(f'score is {self.score}')
def info(self): #重寫父類方法
super().info(); #調用父類方法
print(f'score is {self.score}')
st = Student('ge',29,100)
st.info()
'''
重寫父類方法,super().父類方法
'''
st.info() #重寫之后,先調用自己但方法
'''
object類:
'''
class Teacher(Person):
def __init__(self):
pass
def __str__(self):
print("重寫此方法,返回對類對象但描述")
'''
多態:具有多種形態,
不知道一個變量所引用但對象到底是什么類型,仍然可以通過這個變量調用方法,在運行過程中根據變量所引用對象但類型,動態決定調用哪個對象中但方法
JAVA是靜態語言,其實現多態的三個必要條件
1、繼承
2、方法重寫
3、父類引用指向子類對象
動態語言崇尚"鴨子類型",只關注對象行為,不必關注對象
'''
class Animal:
def eat(self):
print('動物會吃')
class Dog(Animal):
def eat(self):
print('狗吃肉')
class Cat(Animal):
def eat(self):
print('貓吃魚')
class Person:
def eat(self):
print('人吃五谷雜糧')
def __add__(self, other):
return self.name +other.name
#定義一個函數
def fun(obj):
obj.eat()
fun(Cat())
fun(Dog())
fun(Animal())
fun(Person()) #多態
'''
特殊方法和特殊屬性
屬性:__dict__: 獲得對象或實例對象所綁定的索引屬性和方法的字典
屬性:__len__():通過重寫__len__()方法,讓內置函數len()的參數可以是自定義類型
方法:__add__():通過重寫__add__()方法,可是自定義對象具有'+'功能
方法:__new__():用于創建對象
方法:__init__():創建的對象進行初始化
'''
p = Person()
print(p.__dict__) #實例對象的
print(Person.__dict__) #類的
print(p.__class__) #對象所屬的類
c = Cat()
print(Cat.__base__) #父類元素,如果有多個父類,用bases
a=10
b=30
c = a+b
print(c)
c = a.__add__(b)
print(c)
p1 = Person()
p1.name = 'zhang'
p2 = Person()
p2.name = 'san'
print(p1.__add__(p2))
print(p1+p2) #因為在Person類中寫了__add__()方法,才能使用相加
'''
__new__與__init__
__new__ : 在前創建對象
__init__:對已經創建的對象初始化
'''
class Car:
def __new__(cls, *args, **kwargs):
pass
def __init__(self):
pass