python基础——继承与派生、组合
python基礎——繼承與派生
?
1 什么是繼承:
繼承是一種創建新的類的方式,在python中,新建的類可以繼承自一個或者多個父類,原始類成為基類或超累,新建的類成為派生類或子類
?
1.1 繼承分為:單繼承和多繼承
?
class ParentClass1:#定義父類passclass ParentClass2:#定義父類passclass SubClass1(ParentClass1):#單繼承,基類是parentClass1,派生類是SubClasspassclass SubClass2(ParentClass1,ParentClass2):#python支持多繼承,用逗號分割開多個繼承的類pass
?
1.2?查看繼承
>>> SubClass1.__bases__ (<class '__main__.ParentClass1'>,) >>> SubClass2.__bases__ (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
提示:如果沒有指定基類,python的類會默認繼承object類,object是所有python類的基類,它提供了一些常見方法(如__str__)的實現。
>>> ParentClass1.__bases__
(<class 'object'>,)
>>> ParentClass2.__bases__
(<class 'object'>,)
?
1.3 繼承與抽象(先抽象在繼承)
?
抽象即抽取類似或者說比較像的部分。
?
抽象分成兩個層次:?
?
1.將奧巴馬和梅西這倆對象比較像的部分抽取成類;?
?
2.將人,豬,狗這三個類比較像的部分抽取成父類。
?
抽象最主要的作用是劃分類別(可以隔離關注點,降低復雜度)
?
?
?繼承:是基于抽象的結果,通過編程語言去實現它,肯定是先經歷抽象這個過程,才能通過繼承的方式去表達出抽象的結構。
?抽象只是分析和設計的過程中,一個動作或者說一種技巧,通過抽象可以得到類
?
例子:
?
class Animal:def __init__(self,name,age):self.name=nameself.age=agedef walk(self):def say(self):print('%s is saying'%self.name)
class People(Animal):pass
class Pig(Animal):pass
class Dog(Animal):passp1=People("obama",50)print(p1.name)
print(p1.age)p1.walk() #先找walk名字 找相應的值,去父類找p1.say()
?
obama
50
obama is walking
obama is saying
1.4 繼承與重用性
?
?在開發程序的過程中,如果我們定義了一個類A,然后又想新建立另外一個類B,但是類B的大部分內容與類A的相同時
?
我們不可能從頭開始寫一個類B,這就用到了類的繼承的概念。
?
通過繼承的方式新建類B,讓B繼承A,B會‘遺傳’A的所有屬性(數據屬性和函數屬性),實現代碼重用
class Hero:def __init__(self,nickname,aggressivity,life_value):self.nickname=nicknameself.aggressivity=aggressivityself.life_value=life_valuedef move_forward(self):print('%s move forward' %self.nickname)def move_backward(self):print('%s move backward' %self.nickname)def move_left(self):print('%s move forward' %self.nickname)def move_right(self):print('%s move forward' %self.nickname)def attack(self,enemy):enemy.life_value-=self.aggressivity
class Garen(Hero):passclass Riven(Hero):passg1=Garen('草叢倫',100,300)
r1=Riven('銳雯雯',57,200)print(g1.life_value)
r1.attack(g1)
print(g1.life_value)'''
運行結果
300
243
'''
?
1.5 繼承與派生
?
1、派生,父類里面沒有的,在子類里面定義獨有的,派生出新的東西。
?
2、派生出父類里面重名的東西,再找先找用子類自己的構造方法。
?
?
例子:父類里面沒有的,在子類里面定義獨有的
?
class Hero:def __init__(self,nicname,aggressivity,life_value):self.nicname=nicnameself.aggressivity=aggressivityself.life_value=life_valuedef attack(self,enemy):enemy.life_value-=self.aggressivity
class Garen(Hero):camp='Demacia'class Riven(Hero):camp='Noxus'g1=Garen('garen',18,200)
r1=Riven('riven',18,200)
print(g1.camp)
print(r1.camp)
?
輸出結果為:
Demacia
Noxus
?
父類里面重名的東西,再找先找用子類自己的構造方法。
class Hero:def __init__(self,nicname,aggressivity,life_value):self.nicname=nicnameself.aggressivity=aggressivityself.life_value=life_valuedef attack(self,enemy):print('Hero attack')enemy.life_value-=self.aggressivity
class Garen(Hero):camp='Demacia'def attack(self,enemy):Hero.attack(self,enemy)print('from garen attack')def fire(self):print('%s is firing'%self.nicname)class Riven(Hero):camp='Noxus'g1=Garen('garen',18,200)
r1=Riven('riven',18,200)
print(g1.camp)
g1.attack(r1)
print(g1.camp)
輸出結果為:
Hero attack
from garen attack
Demacia
延續第二種:在子類里面添加新的獨有的功能,如:“script”garen獨有的,但是garen的身份在父類里,可以重用父類的功能
在子類中,重用父類的函數,父類名.父類函數(參數)
class Hero:def __init__(self,nicname,aggressivity,life_value):self.nicname=nicnameself.aggressivity=aggressivityself.life_value=life_valuedef attack(self,enemy):print('Hero attack')enemy.life_value-=self.aggressivity
class Garen(Hero):camp='Demacia'def __init__(self,nicname,aggressivity,life_value,script):Hero.__init__(self,nicname,aggressivity,life_value)self.script=scriptdef attack(self,enemy):Hero.attack(self,enemy)print('from garen attack')
g1=Garen('garen',18,2,'人在塔在')print(g1.script)
輸出結果為:
人在塔在
2、組合
軟件重用的重要方式除了繼承之外還有另外一種方式,即:組合
組合指的是,在一個類中以另外一個類的對象作為數據屬性,稱為類的組合
組合對比繼承來說,也是用來重用代碼,但是組合描述的是一種“有的關系”
?
2.1 組合的方式:
用組合的方式建立了類與組合的類之間的關系,它是一種‘有’的關系,比如老師學生有python課程
class Teacher:def __init__(self,name,sex,course):self.name=nameself.sex=sexself.course=course
class Student:def __init__(self,name,sex,course):self.name=nameself.sex=sexself.course=course
class Course:def __init__(self,name,price,period):self.name=nameself.price=priceself.period=period
Course_obj=Course('python','15800','7m')
t1=Teacher('allen','male',Course_obj)
s1=Student('susan','male',Course_obj)
print(s1.course.name)
print(t1.course.name)
輸出結果為:
python
python
組合與繼承都是有效地利用已有類的資源的重要方式。但是二者的概念和使用場景皆不同
?
2.2?繼承的方式:
通過繼承建立了派生類與基類之間的關系,它是一種'是'的關系,比如白馬是馬,人是動物。
當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好,比如教授是老師
>>> class Teacher:
... def __init__(self,name,gender):
... self.name=name
... self.gender=gender
... def teach(self):
... print('teaching')
...
>>>
>>> class Professor(Teacher):
... pass
...
>>> p1=Professor('egon','male')
>>> p1.teach()
teaching
?
轉載于:https://www.cnblogs.com/niejinmei/p/6762317.html
總結
以上是生活随笔為你收集整理的python基础——继承与派生、组合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝珠最高几级
- 下一篇: Hitcon 2016 Pwn赛题学习