類(Class): 用來描述具有相同的屬性和方法的對象的集合。
成都創新互聯公司長期為上千多家客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為梅里斯企業提供專業的成都網站建設、做網站,梅里斯網站改版等技術服務。擁有十多年豐富建站經驗和眾多成功案例,為您定制開發。
類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為實例變量使用。
類有一個名為 __init__() 的特殊方法(構造方法),該方法在類實例化時會自動調用
self:self 代表的是類的實例,代表當前對象的地址,而 self.class 則指向類。
類調用 Car.weight
實例化 car01=Car(5)
實例對象調用 car01.weght
我們在構造類時,Python3默認我們繼承了object這個基類,我個人理解object就是個空的類,可以不用管為何要在括號中寫上object,這是Python3的特性,在python2中如果你沒有寫object的話不會默認繼承了object這個基類。
同樣的我們自己希望繼承的父類只需要把objetc改為我們自己定義的類名即可。子類中可以擁有父類中所有的公有屬性和方法,但是可以通過在變量名前加下劃線使其變為私有,這樣子類就不可以訪問父類中的成員了。
以下三個公交車類的父類均為客車類,我們可以寫一個funcs方法使得每次調用funcs方法時,傳入不同的對象以執行不同的func方法,具體實現如下:
主函數 :
可以看到,我將小 汽車 實例化為帶有重量為5t的一個具體對象,將客車實例化為帶有重量為20t的一個具體對象,將三個公交車實例化為帶有重量為15t的一個具體對象.
如上圖所示,我每次在調用funcs方法時都傳入了一個實例化對象,funcs根據不同的對象執行相應的內部方法。
如果要編寫的類是另一個類的特殊版本時,那么就可以使用繼承 。原有的類稱為父類 , 新類稱為子類 。 子類繼承了父類的所有屬性和方法, 同時子類還可以自定義自己的屬性和方法。
定義子類的實例時, 可以通過 子類的 __init__() 方法,給父類的所有屬性賦值。
假設有這樣的一個 User 類:
接著,我們定義一個 Admin 類,讓它繼承 User 類:
運行結果:
super() 是一個特殊函數, 它會把父類和子類關聯起來。因為父類也稱為超類 ( superclass),所以這個函數叫做 super。接著調用父類的 __init__() 方法, 讓子類包含父類的所有屬性。
子類除了擁有繼承父類而來的屬性和方法之外,還可以自定義子類自己的屬性和方法。
一般情況下,管理員賬號比普通賬號,擁有更高級別的權限。因此,我們為 Admin 定義一個有別于 User 的 privileges 屬性,并定義一個 “打印擁有的權限” 的新方法:
運行結果:
對于繼承而來的父類方法, 如果它不符合子類所期望的行為,那么就可以對其重寫。 只要在子類中定義一個與父類同名的方法,即可實現重寫。
User 本身定義了一個 “是否驗證通過” 的方法,Admin 是管理員,所以需要在打印日志中特別標注出來,這時就需要重寫父類定義的方法:
運行結果:
通過重寫父類方法, 我們就可以讓子類即可以保留或改寫從父類取其精華,棄其“糟粕”啦。
當實體越來越復雜,對應的類變得越來越大時, 我們可以將這個大型類拆分成多個可協同工作的小類。
比如,賬號權限,其實即使是普通賬號也是有某些權限的。所以我們把權限定義為一個類,然后在 Admin 中使用它:
9.5. 繼承
當然,如果一種語言不支持繼承就,“類”就沒有什么意義。派生類的定義如下所示:
class DerivedClassName(BaseClassName):
命名 BaseClassName (示例中的基類名)必須與派生類定義在一個作用域內。除了類,還可以用表達式,基類定義在另一個模塊中時這一點非常有用:
class DerivedClassName(modname.BaseClassName):
派生類定義的執行過程和基類是一樣的。構造派生類對象時,就記住了基類。這在解析屬性引用的時候尤其有用:如果在類中找不到請求調用的屬性,就搜索基類。如果基類是由別的類派生而來,這個規則會遞歸的應用上去。
派生類的實例化沒有什么特殊之處: DerivedClassName() (示列中的派生類)創建一個新的類實例。方法引用按如下規則解析:搜索對應的類屬性,必要時沿基類鏈逐級搜索,如果找到了函數對象這個方法引用就是合法的。
派生類可能會覆蓋其基類的方法。因為方法調用同一個對象中的其它方法時沒有特權,基類的方法調用同一個基類的方法時,可能實際上最終調用了派生類中的覆蓋方法。(對于 C++ 程序員來說,Python 中的所有方法本質上都是 虛 方法。)
派生類中的覆蓋方法可能是想要擴充而不是簡單的替代基類中的重名方法。有一個簡單的方法可以直接調用基類方法,只要調用: BaseClassName.methodname(self, arguments)。有時這對于客戶也很有用。(要注意只有 BaseClassName 在同一全局作用域定義或導入時才能這樣用。)
Python 有兩個用于繼承的函數:
函數 isinstance() 用于檢查實例類型: isinstance(obj, int) 只有在 obj.__class__ 是 int 或其它從 int 繼承的類型
函數 issubclass() 用于檢查類繼承: issubclass(bool, int) 為 True,因為 bool 是 int 的子類。
然而, issubclass(float, int) 為 False,因為 float 不是 int 的子類。
Python面向對象編程之繼承與多態詳解
本文實例講述了Python面向對象編程之繼承與多態。分享給大家供大家參考,具體如下:
Python 類的繼承
在OOP(Object Oriented Programming)程序設計中,當我們定義一個class的時候,可以從某個現有的class 繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。
我們先來定義一個class Person,表示人,定義屬性變量 name 及 sex (姓名和性別);
定義一個方法print_title():當sex是male時,print man;當sex 是female時,print woman。參考如下代碼:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 繼承 Person
pass
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex) # 子類繼承父類方法及屬性
May.print_title()
Peter.print_title()
而我們編寫 Child 類,完全可以繼承 Person 類(Child 就是 Person);使用 class subclass_name(baseclass_name) 來表示繼承;
繼承有什么好處?最大的好處是子類獲得了父類的全部屬性及功能。如下 Child 類就可以直接使用父類的 print_title() 方法
實例化Child的時候,子類繼承了父類的構造函數,就需要提供父類Person要求的兩個屬性變量 name 及 sex:
在繼承關系中,如果一個實例的數據類型是某個子類,那它也可以被看做是父類(May 既是 Child 又是 Person)。但是,反過來就不行(Peter 僅是 Person,而不是Child)。
繼承還可以一級一級地繼承下來,就好比從爺爺到爸爸、再到兒子這樣的關系。而任何類,最終都可以追溯到根類object,這些繼承關系看上去就像一顆倒著的樹。比如如下的繼承樹:
isinstance() 及 issubclass()
Python 與其他語言不同點在于,當我們定義一個 class 的時候,我們實際上就定義了一種數據類型。我們定義的數據類型和Python自帶的數據類型,比如str、list、dict沒什么兩樣。
Python 有兩個判斷繼承的函數:isinstance() 用于檢查實例類型;issubclass() 用于檢查類繼承。參見下方示例:
class Person(object):
pass
class Child(Person): # Child 繼承 Person
pass
May = Child()
Peter = Person()
print(isinstance(May,Child)) # True
print(isinstance(May,Person)) # True
print(isinstance(Peter,Child)) # False
print(isinstance(Peter,Person)) # True
print(issubclass(Child,Person)) # True
Python 類的多態
在說明多態是什么之前,我們在 Child 類中重寫 print_title() 方法:若為male,print boy;若為female,print girl
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 繼承 Person
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)
May.print_title()
Peter.print_title()
當子類和父類都存在相同的 print_title()方法時,子類的 print_title() 覆蓋了父類的 print_title(),在代碼運行時,會調用子類的 print_title()
這樣,我們就獲得了繼承的另一個好處:多態。
多態的好處就是,當我們需要傳入更多的子類,例如新增 Teenagers、Grownups 等時,我們只需要繼承 Person 類型就可以了,而print_title()方法既可以直不重寫(即使用Person的),也可以重寫一個特有的。這就是多態的意思。調用方只管調用,不管細節,而當我們新增一種Person的子類時,只要確保新方法編寫正確,而不用管原來的代碼。這就是著名的“開閉”原則:
對擴展開放(Open for extension):允許子類重寫方法函數
對修改封閉(Closed for modification):不重寫,直接繼承父類方法函數
子類重寫構造函數
子類可以沒有構造函數,表示同父類構造一致;子類也可重寫構造函數;現在,我們需要在子類 Child 中新增兩個屬性變量:mother 和 father,我們可以構造如下(建議子類調用父類的構造方法,參見后續代碼):
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 繼承 Person
def __init__(self,name,sex,mother,father):
self.name = name
self.sex = sex
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
若父類構造函數包含很多屬性,子類僅需新增1、2個,會有不少冗余的代碼,這邊,子類可對父類的構造方法進行調用,參考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 繼承 Person
def __init__(self,name,sex,mother,father):
Person.__init__(self,name,sex) # 子類對父類的構造方法的調用
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
多重繼承
多重繼承的概念應該比較好理解,比如現在需要新建一個類 baby 繼承 Child , 可繼承父類及父類上層類的屬性及方法,優先使用層類近的方法,代碼參考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person):
pass
class Baby(Child):
pass
May = Baby("May","female") # 繼承上上層父類的屬性
print(May.name,May.sex)
May.print_title() # 可使用上上層父類的方法
class Child(Person):
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
class Baby(Child):
pass
May = Baby("May","female")
May.print_title() # 優先使用上層類的方法
可能你有C++的基礎吧,C++確實可以不用帶上this。我把你的代碼稍微改了一下,你可以分別看看cls1.n、cls2.n、self.n的輸出。 class cls1: n=3 class cls2(cls1): def __init__(self,cls1=cls1): cls2.n += 1 self.n += 2 print 'cls1.n:%s'%cls1.n print 'cls2.n:%s'%cls2.n print 'self.n:%s'%self.n cls2() print 'cls1.n:%s'%cls1.n 可以看出兩個類和一個對象都可以在這里調用它們的n屬性,如果只敲一個n別人讀你的代碼時就比較容易產生岐義,雖然少打了5個字符,但是不符合簡單明確的pythonic哲學。當然你也可以就認為python語法規則就是這么規定的。
python的繼承實際上是一個指針或者是引用的鏈表。它是動態語言。
面向對象有多態、繼承、封裝幾個主要概念。要形成面向對象還需要分層,抽象,動靜態建模等技能。
繼承通常是指類的繼承,派生類從基類里繼承它的屬性與方法。當然也可以重載基類的方法,或者是重寫方法。python里雖然可以重寫方法,不過仍然可以通過super等函數修飾獲得基類方法。
基類又稱父類。派生類也稱為子類。
屬性就是對象中的變量。方法就是對象中的函數。
類是一種定義。如果類有了實例,就稱為對象。類是對象的靜態結構的描述,是聲明。
本文名稱:python繼承函數 Python 類 繼承
本文來源:http://vcdvsql.cn/article24/hiooce.html
成都網站建設公司_創新互聯,為您提供手機網站建設、網站營銷、網站設計、定制網站、品牌網站建設、網站導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯