經過前面的學習咱們知道,事與物都是對象,咱們都能將其定義爲一個類,python中將該類定義爲object,咱們所建立的類都是直接或間接繼承與object,他們都有object類的屬性和方法,面向對象有抽象、繼承、封裝、多態四個特性。python
抽象編程
建立類要經過class關鍵字來建立,好比有一我的,咱們要實現他的類,咱們把它抽象爲Person編程語言
class Person:學習
pass #若是沒有想要封裝的屬性咱們能夠經過pass關鍵字來結束spa
封裝對象
對象有本身的屬性和方法,好比一我的,他有本身的姓名和年齡的屬性,他能幹什麼這是他的方法,咱們能夠定義他的名字屬性爲name,年齡爲age,他能跑步、說話的方法,咱們能夠定義跑步run(),speak()繼承
class Person:it
name = 'Tom'class
age = 18object
def run(self):
print('我正在跑步')
def speak(self):
print('我正在說話')
p = Person() # p就是類的一個實例體現
print(p.name,p.age) #打印結果: Tom 18
p.run() #打印結果: 我正在跑步 調用run()方法咱們不用傳入參數,self是對象的實例,直接用p.run()就能實現實例方法
p.spaek() #打印結果: 我正在說話
這樣咱們就建立了一個叫Tom的人,可是咱們經過p2 = Person()再建立一我的,咱們打印他的名字和年齡會發現,他也叫Tom,可是這兩我的顯然不是同一我的,咱們須要的是經過這個類來建立另一個叫jack的人,而且運行方法run()他們會打印不一樣的跑路方式
class Person:
name = 'Tom'
age = 18
def __init__(self,name=None): #name=None表示參數能夠不傳入,當不傳入參數建立實例時咱們的name在實例中找不到就回去類中去找,實例的name仍是Tom
if name is not None:
self.name = name
def run(self,where):
print('%s在%s跑步'%(self.name,where))
p = Person('jack')
p2 = Person('jerry')
print(p.name,p2.name) # 打印結果: jack jerry
p.run('公園') #打印結果:jack在公園跑步
p2.run('馬路') #打印結果:jerry在馬路跑步
咱們是怎麼實現Person('jack')就建立了一個叫jack的人呢,這裏咱們用到了__init__()方法,咱們在建立類的時候,會自動調用__init__()方法,咱們從新定義__init__(),在裏面加入name參數,咱們把jack傳入到Person類中進行調用建立實例,並改變實例的name.
繼承
什麼是繼承,好比貓和狗,他們都有相同的特性,他們都是動物,那麼咱們能夠把動物當成一個類Animal,貓抽象Cat類,狗抽象爲Dog類,貓會叫,狗也會叫,動物會叫,因此咱們定義一個方法cry()
class Animal:
def cry(self):
print('嗚嗚嗚')
class Cat(Animal):
pass
class Dog(Animal):
pass
cat = Cat()
cat.cry() #打印結果: 嗚嗚嗚
dog = Dog()
dog.cry() #打印結果:嗚嗚嗚
咱們發現打印的是嗚嗚嗚,那麼咱們就調用了Animal的cry()方法,咱們的cat在調用cry()時在Cat類中找不到,就回去父類去找,找不到就會去祖父類去找,知道object類,若是還找不到就會報錯
咱們要實現貓叫喵喵喵,就從寫cry()方法
class Cat(Animal):
def cry(self):
print('喵喵喵')
cat = Cat()
cat.cry() #打印結果: 喵喵喵
咱們這樣實現會發現不是很對勁,爲何不直接實現Cat類不去繼承Animal,這樣咱們就要考慮到什麼狀況使用繼承比較好,那就是有些屬性和方法是固定不變的那麼實現繼承就是正確的。
多態
什麼是多態?好比a=1,那麼就會建立一個int類型值爲1的對象,爲何會把1認定爲就是int型呢?python是一門動態編程語言,在內部後自動對1進行判斷,而後賦給他int類型,這是多態的體現,也就是人們提出的鴨子模型,若是一個物體跑起來像鴨子,那麼他就是鴨子,多態更注重於方法的實現,不在關注類自己。
class Duck:
def run(self):
print('我像一隻鴨子')
class A:
def run(self):
print('我看起來像一隻鴨子')
def func(obj):
obj.run()
duck = Duck()
a = A()
func(duck) #我像一隻鴨子
func(a) #我看起來像一隻鴨子
那麼咱們說duck和a都是一隻鴨子