1、繼承python
面向對象中的繼承就是繼承的類直接擁有被繼承類的屬性而不須要在本身的類體中從新再寫一遍,其中被繼承的類叫作父類、基類,繼承的類叫作派生類、子類。在python3中若是不指定繼承哪一個類,默認就會繼承Object類,而繼承了Object類的類就叫作新式類,而在python2中若是不指定繼承哪一個類也不會默認去繼承Object類,而沒有繼承Object類的類就叫作經典類。經典類和新式類的不一樣就在於對方法的搜索順序不一樣,經典類是深度優先即先找本身類內,若是沒有就找左邊第一個父類,沒找到繼續從這個父類的父類中找依次類推直到找到最上一級的父類也沒找到再找左邊第二個父類,而後再重複以前的過程,直到全部父類找一遍沒找到就報錯;而新式類是廣度優先,當下一個類能夠經過其餘類找到時就先不去找它,而是找繼承關係中與它的子類同級的其餘類,依次類推直到最後找到object類沒有找到指定方法就報錯。新式類搜索順序圖示以下,還能夠經過類名.mro()查看新式類繼承中的屬性搜索順序函數
2、單繼承與多繼承spa
在其餘語言中只支持單繼承即class 類名(父類名),而python支持多繼承,用逗號將多個父類隔開即class 類名(父類名1,父類名2,。。。。)code
3、繼承與抽象對象
抽象就是把一類事物的共有特性提取出來,繼承則是把父類的屬性拿過來而且還擁有本身的屬性。抽象是包含的範圍愈來愈大,共性愈來愈少,繼承則是包含的返回愈來愈小,共性愈來愈多。咱們定義父類的過程就是抽象,定義子類的過程就是繼承。blog
4、父類方法重寫繼承
咱們把子類有而父類沒有的方法叫作子類的派生方法,而父類有子類也有的方法叫作對父類方法的重寫,由於按照類方法的搜索順序一個方法若是在子類中有就不會再從父類中找了,結果就是父類中的方法沒法調用了,若是既想執行父類中的方法同時在子類中又能定義新功能,就須要先把父類中的這個方法單獨繼承過來,在python中只能使用父類名.方法名(self,父類的其餘參數)的方式,在python3中可使用super函數來實現,好比super().父類方法名(除self外的其餘參數),其實在super函數中還須要傳入子類名和子類對象(在類中用self),可是咱們使用時不須要特地去傳,除非在類外單獨調用父類的方法。注意在繼承父類方法時父類的參數除了須要在父類的方法中傳遞還須要在子類重寫的方法中傳遞接口
class Animal: def __init__(self,name,life_value,aggr): self.name=name self.life_value=life_value self.aggr=aggr def eat(self): self.life_value+=10 class Person(Animal): def __init__(self,money,name,life_value,aggr): super().__init__(name,life_value,aggr) self.money=money def attack(self,obj): obj.life_value-=self.aggr
5、接口類內存
接口類是用於規範子類的方法名定義用的,繼承接口類的子類能夠不存在任何邏輯上的關係可是都須要實現某些共同的方法,爲了讓這些子類的方法名可以統一以便以後調用這些方法時不須要關注具體的對象就用接口類規範了這些方法的名字,子類一旦繼承了接口類就必須實現接口類中定義的方法,不然在子類實例化的時候就會報錯,而接口類自己則不須要實現去實現這些方法。字符串
1 from abc import ABCMeta,abstractmethod 2 class Payment(metaclass=ABCMeta): 3 @abstractmethod 4 def pay(self,money):pass 5 6 class Wechatpay(Payment): 7 def pay(self,money): #子類中必須定義接口類中有的方法,不然實例化會報錯 8 pass 9 10 w1=Wechatpay()
6、抽象類
抽象類的做用和接口類同樣,只是繼承它的子類通常存在一些邏輯上的關係,且抽象類中的方法能夠去實現,子類在重寫時用super函數調用抽象類的方法便可,同時在用抽象類時使用單繼承,使用接口類時使用多繼承
7、多態
多態就是不一樣的對象能夠調用相同的方法而後獲得不一樣的結果,有點相似接口類的感受,在python中到處體現着多態,好比無論你是列表仍是字符串仍是數字均可以使用+和*。
8、封裝
封裝就是把類中的屬性和方法定義爲私有的,方法就是在屬性名或方法名前加雙下劃線,而一旦這樣定義了屬性或方法名後,python會自動將其轉換爲_類名__屬性名(方法名)的格式,在類的內部調用仍是用雙下劃線加屬性名或方法名,在類的外部調用就要用_類名__屬性名(方法名)。父類的私有屬性和方法,子類沒法對其進行修改。
9、類的裝飾器
property屬性裝飾器:將類內的方法的調用方式和屬性同樣,這個裝飾器還有和其配套的setter、deleter。
class Demo: @property def p(self): print('property func') @p.setter def p(self,num): print('property_setter') @p.deleter def p(self): print('在刪除') d=Demo() d.p d.p=10 del d.p -------------------------------------------------------------------------------------- property func property_setter 在刪除
staticmethod靜態方法裝飾器:將類內的方法變成普通的函數,或者把類外的函數放到類內看成方法調用
class A: @staticmethod def sum(): #這個方法跟普通函數沒有區別 print('staticmethod') A.sum() #用類名調用 -------------------------------------------------------------------------------------- staticmethod
classmethod類方法裝飾器:該方法用於操做類屬性,沒法操做對象屬性
class A: role='male' @classmethod def sum(cls): #用於操做類屬性 print(cls.role) A.sum() #用類名調用 -------------------------------------------------------------------------------------- male
10、isinstance和type的區別以及issubclass
isinstance和type均可以用於判斷對象和指定類間的關係,可是isinstance的判斷沒有type準確,它沒法正確判斷子類的對象和其父類的關係
class A: pass class B(A): pass b=B() print(isinstance(b,B)) print(isinstance(b,A)) print(type(b) is B) print(type(b) is A) -------------------------------------------------------------------------------------- True True True False
issubclass用於判斷給定的兩個類,前者是不是後者的子類
11、反射
hasattr(對象或類名,‘屬性或方法名’) 判斷指定的對象或類中是否存在指定的屬性或方法,有返回True
getattr(對象或類名,'屬性或方法名') 獲取對象或類的指定屬性值或方法的內存地址
setattr(對象或類名,‘新屬性名’,新屬性值) 給對象或類添加新的屬性或方法
delattr(對象或類名,‘新屬性名’) 刪除以前添加的屬性
12、類的內置方法
__doc__ :輸出類的描述信息
__module__ :表示當前操做的對象在那個模塊
__class__ : 表示當前操做的對象的類是什麼
__dict__ :查看類或對象中的全部成員 類調用打印類的全部屬性,不包括實例屬性。實例調用打印全部實例屬性
__str__ 格式化輸出%s輸出該方法的值
__repr__ 格式化輸出%r輸出該方法的值,而且%s在沒有__str__方法時也是輸出該方法的值
__del__ del 執行該方法
__getitem__ 用對象加[]方式取值
class A: def __init__(self): self.names=['egon','alex','eva'] #能夠是其餘序列 def __getitem__(self, item): print(self.names[item]) a=A() a[1]
----------------------------------------------------------
alex
__setitem__ 添加值
__delitem__ 刪除值
__new__ 用於建立沒有屬性的對象,調用object的__new__便可不須要本身實現。能夠利用該方法實現單例模式
__call__ 對象加括號執行該方法
__len__ len()執行該方法
__eq__ ==運算輸出該方法的值
__hash__ hash執行該方法