python之繼承和多態

一 python之繼承
1.1 繼承的特點:
總要從某個類繼承,如果沒有繼承類,則可以繼承基類object類
子類只能繼承父類中公有成員和方法,不能繼承父類的私有成員;
在繼承中基類的構造函數( init()方法 )不會自動調用,他需要子類構造函數中通過super()語句手動調用

1.2 繼承的優點:
實現代碼複用,減少代碼量
***擁有父類的所有功能,***只需要編寫子類附加功能即可----最大的好處是子類獲得了父類的全部功能p
1.3 例子

class Person(object):
	def __init__(self, name, gender):
		self.name = name
		self.gender = gender
	
class Student(Person):
	def __init__(self, name, gender, score):
		super(Student, self).__init__(name, gender)  # 初始化父類
		self.score = score
詳解:
	子類必須要使用super(子類名, self).__init__(子類需要繼承父類的參數)去初始化父類;否則子類將無法繼承父類中name和gender.
      super(子類名, self)將返回當前類繼承的父類,then調用__init__(),此時__init__()已經不需要再傳self參數[因爲super已經傳入]

class Teacher(Person):
	def __init__(self, name, gender, course):
		super(Teacher, self).__init__(name, gender)
		self.course = course

t = Teacher("Alice", 'Female', 'English')
p = Person('Tim', 'Male')

print(isinstance(t, Person))		# True
print(isinstance(t, Teacher))		# True
print(isinstace(p,Person))			# True
print(isinstance(p,Teacher))		# False

1.4 多繼承
多重繼承的目的是從兩種繼承樹中分別選擇並繼承出子類,以便組合功能使用。

class A(object):
	def __init__(self, a):
		print('init A ... ')
		self.a = a

class B(A):
	def __init__(self, a):
		super(B, self).__init__(a)
		print('init B ... ')

class C(A):
	def __init__(self, a):
		super(C, self).__init__(self, a)
		print('init C ... ')

class D(B,C):
	def __init__(self, a):
		super(D, self).__init__(a)
		print('init D ... ')

詳解:D同時繼承B和C,B和Cyou繼承於A,因此D擁有A,B和C的全部功能,如果沒有多繼承,就需要在D中寫A、B、C的所有功能

二 python之多態
2.1 方法重寫
如果在子類中定義了一個方法,其名稱、參數列表和返回類型 正好<==> 和父類中某個方法名稱、參數列表和返回值類型完全相同,那麼可以說,子類的方法重寫了父類的方法。
方法重寫發生在不同類,是實現多態的必要條件。
多態特點----對擴展開放 && 對修改封閉
對擴展開放即可以隨意的增加父類的子類;
對修改封閉即對於依賴父類的函數,新增子類對該函數無任何影響無需做任何修改

2.2 多態
多態依賴繼承,從一個父類派生出多個子類,這些子類都擁有父類的方法和屬性,同時又可以自定義不同的方法和屬性【如果對父類中某個方法不滿意,可以在子類中重寫父類的方法】,這種行爲稱之爲多態。
問題1:當子類和父類同時同一中方法時,【總是優先調用子類中方法】子類方法的優先級高於父類方法,即子類覆蓋父類;只要方法存在,參數正確,就可以調用。

class Person(object):
	def __init__(self, name, gender):
		self.name = name
		self.gender = gender
	def whoAmI(self):
		return 'I am a Person, my name is %s' % self.name

class Student(Person):
	def __init__(self, name, gender, score):
		super(Student, self).__init__(name,gender)
		self.score = score
	def whoAmI(self):
		return 'I am a Student, my name is %s' % self.name
p = Person('Tim', 'Male').whoAmI()		# I am a Person, my name is Tim
s = Student('Bob', 'Male', 88).whoAmI()   # I am a Student, my name is Bob 

解析:子類.方法,該方法如果在子類中定義,直接調用;
                 該方法如果在子類中每定義,順着繼承鏈向上查找,直到在某個父類中找到該方法爲止
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章