python基础——继承与派生、组合
python基礎(chǔ)——繼承與派生
?
1 什么是繼承:
繼承是一種創(chuàng)建新的類(lèi)的方式,在python中,新建的類(lèi)可以繼承自一個(gè)或者多個(gè)父類(lèi),原始類(lèi)成為基類(lèi)或超累,新建的類(lèi)成為派生類(lèi)或子類(lèi)
?
1.1 繼承分為:單繼承和多繼承
?
class ParentClass1:#定義父類(lèi)passclass ParentClass2:#定義父類(lèi)passclass SubClass1(ParentClass1):#單繼承,基類(lèi)是parentClass1,派生類(lèi)是SubClasspassclass SubClass2(ParentClass1,ParentClass2):#python支持多繼承,用逗號(hào)分割開(kāi)多個(gè)繼承的類(lèi)pass
?
1.2?查看繼承
>>> SubClass1.__bases__ (<class '__main__.ParentClass1'>,) >>> SubClass2.__bases__ (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
提示:如果沒(méi)有指定基類(lèi),python的類(lèi)會(huì)默認(rèn)繼承object類(lèi),object是所有python類(lèi)的基類(lèi),它提供了一些常見(jiàn)方法(如__str__)的實(shí)現(xiàn)。
>>> ParentClass1.__bases__
(<class 'object'>,)
>>> ParentClass2.__bases__
(<class 'object'>,)
?
1.3 繼承與抽象(先抽象在繼承)
?
抽象即抽取類(lèi)似或者說(shuō)比較像的部分。
?
抽象分成兩個(gè)層次:?
?
1.將奧巴馬和梅西這倆對(duì)象比較像的部分抽取成類(lèi);?
?
2.將人,豬,狗這三個(gè)類(lèi)比較像的部分抽取成父類(lèi)。
?
抽象最主要的作用是劃分類(lèi)別(可以隔離關(guān)注點(diǎn),降低復(fù)雜度)
?
?
?繼承:是基于抽象的結(jié)果,通過(guò)編程語(yǔ)言去實(shí)現(xiàn)它,肯定是先經(jīng)歷抽象這個(gè)過(guò)程,才能通過(guò)繼承的方式去表達(dá)出抽象的結(jié)構(gòu)。
?抽象只是分析和設(shè)計(jì)的過(guò)程中,一個(gè)動(dòng)作或者說(shuō)一種技巧,通過(guò)抽象可以得到類(lèi)
?
例子:
?
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名字 找相應(yīng)的值,去父類(lèi)找p1.say()
?
obama
50
obama is walking
obama is saying
1.4 繼承與重用性
?
?在開(kāi)發(fā)程序的過(guò)程中,如果我們定義了一個(gè)類(lèi)A,然后又想新建立另外一個(gè)類(lèi)B,但是類(lèi)B的大部分內(nèi)容與類(lèi)A的相同時(shí)
?
我們不可能從頭開(kāi)始寫(xiě)一個(gè)類(lèi)B,這就用到了類(lèi)的繼承的概念。
?
通過(guò)繼承的方式新建類(lèi)B,讓B繼承A,B會(huì)‘遺傳’A的所有屬性(數(shù)據(jù)屬性和函數(shù)屬性),實(shí)現(xiàn)代碼重用
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)'''
運(yùn)行結(jié)果
300
243
'''
?
1.5 繼承與派生
?
1、派生,父類(lèi)里面沒(méi)有的,在子類(lèi)里面定義獨(dú)有的,派生出新的東西。
?
2、派生出父類(lèi)里面重名的東西,再找先找用子類(lèi)自己的構(gòu)造方法。
?
?
例子:父類(lèi)里面沒(méi)有的,在子類(lèi)里面定義獨(dú)有的
?
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)
?
輸出結(jié)果為:
Demacia
Noxus
?
父類(lèi)里面重名的東西,再找先找用子類(lèi)自己的構(gòu)造方法。
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)
輸出結(jié)果為:
Hero attack
from garen attack
Demacia
延續(xù)第二種:在子類(lèi)里面添加新的獨(dú)有的功能,如:“script”garen獨(dú)有的,但是garen的身份在父類(lèi)里,可以重用父類(lèi)的功能
在子類(lèi)中,重用父類(lèi)的函數(shù),父類(lèi)名.父類(lèi)函數(shù)(參數(shù))
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)
輸出結(jié)果為:
人在塔在
2、組合
軟件重用的重要方式除了繼承之外還有另外一種方式,即:組合
組合指的是,在一個(gè)類(lèi)中以另外一個(gè)類(lèi)的對(duì)象作為數(shù)據(jù)屬性,稱(chēng)為類(lèi)的組合
組合對(duì)比繼承來(lái)說(shuō),也是用來(lái)重用代碼,但是組合描述的是一種“有的關(guān)系”
?
2.1 組合的方式:
用組合的方式建立了類(lèi)與組合的類(lèi)之間的關(guān)系,它是一種‘有’的關(guān)系,比如老師學(xué)生有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)
輸出結(jié)果為:
python
python
組合與繼承都是有效地利用已有類(lèi)的資源的重要方式。但是二者的概念和使用場(chǎng)景皆不同
?
2.2?繼承的方式:
通過(guò)繼承建立了派生類(lèi)與基類(lèi)之間的關(guān)系,它是一種'是'的關(guān)系,比如白馬是馬,人是動(dòng)物。
當(dāng)類(lèi)之間有很多相同的功能,提取這些共同的功能做成基類(lèi),用繼承比較好,比如教授是老師
>>> 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
?
轉(zhuǎn)載于:https://www.cnblogs.com/niejinmei/p/6762317.html
總結(jié)
以上是生活随笔為你收集整理的python基础——继承与派生、组合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 宝珠最高几级
- 下一篇: Hitcon 2016 Pwn赛题学习