python3類的繼承詳解_基于python3 類的屬性、方法、封裝、繼承詳解

下面小編就為大家帶來一篇基于python3 類的屬性、方法、封裝、繼承實例講解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Python 類

Python中的類提供了面向對象編程的所有基本功能:類的繼承機制允許多個基類,派生類可以覆蓋基類中的任何方法,方法中可以調用基類中的同名方法。

對象可以包含任意數量和類型的數據。

python類與c++類相似,提供了類的封裝,繼承、多繼承,構造函數、析構函數。

在python3中,所有類最頂層父類都是object類,與java類似,如果定義類的時候沒有寫出父類,則object類就是其直接父類。

類定義

類定義語法格式如下:

class ClassName:

.

.

.

類對象:創建一個類之后,可以通過類名訪問、改變其屬性、方法

實例對象:類實例化后,可以使用其屬性,可以動態的為實例對象添加屬性(類似javascript)而不影響類對象。

類的屬性

可以使用點(.)來訪問對象的屬性

也可以使用以下函數的方式來訪問屬性:

getattr(obj, name[, default]) : 訪問對象的屬性

hasattr(obj,name) : 檢查是否存在一個屬性

setattr(obj,name,value) : 設置一個屬性。如果屬性不存在,會創建一個新屬性

delattr(obj, name) : 刪除屬性

Python內置類屬性

__dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)

__doc__ :類的文檔字符串

__name__: 類名

__module__: 類定義所在的模塊(類的全名是'__main__.className',如果類位于一個導入模塊mymod中,那么className.__module__ 等于 mymod)

__bases__ : 類的所有父類構成元素(包含了以個由所有父類組成的元組)

class Person:

"Person類"

def __init__(self, name, age, gender):

print('進入Person的初始化')

self.name = name

self.age = age

self.gender = gender

print('離開Person的初始化')

def getName(self):

print(self.name)

p = Person('ice', 18, '男')

print(p.name) # ice

print(p.age) # 18

print(p.gender) # 男

print(hasattr(p, 'weight')) # False

# 為p添加weight屬性

p.weight = '70kg'

print(hasattr(p, 'weight')) # True

print(getattr(p, 'name')) # ice

print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'}

print(Person.__name__) # Person

print(Person.__doc__) # Person類

print(Person.__dict__) # {'__doc__': 'Person類', '__weakref__': , '__init__': , 'getName': , '__dict__': , '__module__': '__main__'}

print(Person.__mro__) # (, )

print(Person.__bases__) # (,)

print(Person.__module__) # __main__

類的方法

在類地內部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數。

類的專有方法:

__init__ 構造函數,在生成對象時調用

__del__ 析構函數,釋放對象時使用

__repr__ 打印,轉換

__setitem__按照索引賦值

__getitem__按照索引獲取值

__len__獲得長度

__cmp__比較運算

__call__函數調用

__add__加運算

__sub__減運算

__mul__乘運算

__p__除運算

__mod__求余運算

__pow__稱方

__init__()方法是一種特殊的方法,被稱為類的構造函數或初始化方法,當創建了這個類的實例時就會調用該方法,與c++中構造函數類似。只需在自定義的類中重寫__init__()方法即可。

class Person:

def __init__(self, name, age, gender):

print('進入Person的初始化')

self.name = name

self.age = age

self.gender = gender

print('離開Person的初始化')

def getName(self):

print(self.name)

# Person實例對象

p = Person('ice', 18, '男')

print(p.name)

print(p.age)

print(p.gender)

p.getName()

# 進入Person的初始化

# 離開Person的初始化

# ice

# 18

# 男

# ice

析構函數 __del__ ,__del__在對象消逝的時候被調用,當對象不再被使用時,__del__方法運行:

方法

實例方法:只能通過實例調用,實例方法第一個定義的參數只能是實例本身引用

class Myclass:

def foo(self):

print(id(self),'foo')

a=Myclass()#既然是實例對象,那就要創建實例

a.foo()#輸出類里的函數地址

print(id(a))#輸出類對象的地址

#結果地址一樣

類方法:定義類方法,要使用裝飾器@classmethod,定義的第一個參數是能是類對象的引用,可以通過類或者實例直用

class Myclass:

@classmethod#類裝飾器

def foo2(cls):

print(id(cls),'foo2')

#類對象,直接可以調用,不需要實例化

print(id(Myclass),'yy')

Myclass.foo2()#直接可以調用

靜態方法:定義靜態方法使用裝飾器@staticmethod,沒有默認的必須參數,通過類和實例直接調用

class Myclass:

@staticmethod#靜態方法

def foo3():

print('foo3')

Myclass.foo3()#沒有參數

a.foo3()

#結果foo3

類的封裝

python通過變量名命名來區分屬性和方法的訪問權限,默認權限相當于c++和java中的public

類的私有屬性: __private_attrs:兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時self.__private_attrs。

類的私有方法:__private_method:兩個下劃線開頭,聲明該方法為私有方法,不能在類地外部調用。在類的內部調用 self.__private_methods

雖然python不允許實例化的類訪問私有數據,但可以使用 object._className__attrName 訪問屬性。其實python內部私有化的實現只是將attrName屬性變為了_className__attrName而已

class Demo:

__id = 123456

def getId(self):

return self.__id

temp = Demo()

# print(temp.__id) # 報錯 AttributeError: 'Demo' object has no attribute '__id'

print(temp.getId()) # 123456

print(temp._Demo__id) # 123456

類的繼承

面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是通過繼承機制。繼承完全可以理解成類之間的類型和子類型關系。

需要注意的地方:繼承語法 class 派生類名(基類名)://... 基類名寫作括號里,基本類是在類定義的時候,在元組之中指明的。

在python中繼承中的一些特點:

1:在繼承中基類的構造(__init__()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。使用super().__init__()或parentClassName.__init__()

2:在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。區別于在類中調用普通函數時并不需要帶上self參數

3:Python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找。(先在本類中查找調用的方法,找不到才去基類中找)。

如果在繼承元組中列了一個以上的類,那么它就被稱作"多重繼承" 。

語法:

派生類的聲明,與他們的父類類似,繼承的基類列表跟在類名之后。

多態

如果父類方法的功能不能滿足需求,可以在子類重寫父類的方法。實例對象調用方法時會調用其對應子類的重寫后的方法

python3.3 類與繼承 小例

hon中的類提供了面向對象編程的所有基本功能:類的繼承機制允許多個基類,派生類可以覆蓋基類中的任何方法,方法中可以調用基類中的同名方法。

class Base:

def __init__(self):

self.data=[]

def add(self,x):

self.data.append(x)

def addtwice(self,x):

self.add(x)

self.add(x)

# child extends base

class Child(Base):

def plus(self,a,b):

return a+b

oChild=Child()

oChild.add("str1")

oChild.add(999)

oChild.addtwice(4)

print(oChild.data)

print(oChild.plus(2,3))

對象可以包含任意數量和類型的數據。

python類與c++類相似,提供了類的封裝,繼承、多繼承,構造函數、析構函數。

在python3中,所有類最頂層父類都是object類,與java類似,如果定義類的時候沒有寫出父類,則object類就是其直接父類。

類定義

類定義語法格式如下:

class ClassName:

.

.

.

類對象:創建一個類之后,可以通過類名訪問、改變其屬性、方法

實例對象:類實例化后,可以使用其屬性,可以動態的為實例對象添加屬性(類似javascript)而不影響類對象。

類的屬性

可以使用點(.)來訪問對象的屬性

也可以使用以下函數的方式來訪問屬性:

getattr(obj, name[, default]) : 訪問對象的屬性

hasattr(obj,name) : 檢查是否存在一個屬性

setattr(obj,name,value) : 設置一個屬性。如果屬性不存在,會創建一個新屬性

delattr(obj, name) : 刪除屬性

Python內置類屬性

__dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)

__doc__ :類的文檔字符串

__name__: 類名

__module__: 類定義所在的模塊(類的全名是'__main__.className',如果類位于一個導入模塊mymod中,那么className.__module__ 等于 mymod)

__bases__ : 類的所有父類構成元素(包含了以個由所有父類組成的元組)

class Person:

"Person類"

def __init__(self, name, age, gender):

print('進入Person的初始化')

self.name = name

self.age = age

self.gender = gender

print('離開Person的初始化')

def getName(self):

print(self.name)

p = Person('ice', 18, '男')

print(p.name) # ice

print(p.age) # 18

print(p.gender) # 男

print(hasattr(p, 'weight')) # False

# 為p添加weight屬性

p.weight = '70kg'

print(hasattr(p, 'weight')) # True

print(getattr(p, 'name')) # ice

print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'}

print(Person.__name__) # Person

print(Person.__doc__) # Person類

print(Person.__dict__) # {'__doc__': 'Person類', '__weakref__': , '__init__': , 'getName': , '__dict__': , '__module__': '__main__'}

print(Person.__mro__) # (, )

print(Person.__bases__) # (,)

print(Person.__module__) # __main__

類的方法

在類地內部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數。

類的專有方法:

__init__ 構造函數,在生成對象時調用

__del__ 析構函數,釋放對象時使用

__repr__ 打印,轉換

__setitem__按照索引賦值

__getitem__按照索引獲取值

__len__獲得長度

__cmp__比較運算

__call__函數調用

__add__加運算

__sub__減運算

__mul__乘運算

__p__除運算

__mod__求余運算

__pow__稱方

__init__()方法是一種特殊的方法,被稱為類的構造函數或初始化方法,當創建了這個類的實例時就會調用該方法,與c++中構造函數類似。只需在自定義的類中重寫__init__()方法即可。

class Person:

def __init__(self, name, age, gender):

print('進入Person的初始化')

self.name = name

self.age = age

self.gender = gender

print('離開Person的初始化')

def getName(self):

print(self.name)

# Person實例對象

p = Person('ice', 18, '男')

print(p.name)

print(p.age)

print(p.gender)

p.getName()

# 進入Person的初始化

# 離開Person的初始化

# ice

# 18

# 男

# ice

析構函數 __del__ ,__del__在對象消逝的時候被調用,當對象不再被使用時,__del__方法運行:

類的封裝

python通過變量名命名來區分屬性和方法的訪問權限,默認權限相當于c++和java中的public

類的私有屬性: __private_attrs:兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時self.__private_attrs。

類的私有方法:__private_method:兩個下劃線開頭,聲明該方法為私有方法,不能在類地外部調用。在類的內部調用 self.__private_methods

雖然python不允許實例化的類訪問私有數據,但可以使用 object._className__attrName 訪問屬性。其實python內部私有化的實現只是將attrName屬性變為了_className__attrName而已

class Demo:

__id = 123456

def getId(self):

return self.__id

temp = Demo()

# print(temp.__id) # 報錯 AttributeError: 'Demo' object has no attribute '__id'

print(temp.getId()) # 123456

print(temp._Demo__id) # 123456

類的繼承

面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是通過繼承機制。繼承完全可以理解成類之間的類型和子類型關系。

需要注意的地方:繼承語法 class 派生類名(基類名)://... 基類名寫作括號里,基本類是在類定義的時候,在元組之中指明的。

在python中繼承中的一些特點:

1:在繼承中基類的構造(__init__()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。使用super().__init__()或parentClassName.__init__()

2:在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。區別于在類中調用普通函數時并不需要帶上self參數

3:Python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找。(先在本類中查找調用的方法,找不到才去基類中找)。

如果在繼承元組中列了一個以上的類,那么它就被稱作"多重繼承" 。

語法:

派生類的聲明,與他們的父類類似,繼承的基類列表跟在類名之后。

多態

如果父類方法的功能不能滿足需求,可以在子類重寫父類的方法。實例對象調用方法時會調用其對應子類的重寫后的方法

python3.3 類與繼承 小例

class Base:

def __init__(self):

self.data=[]

def add(self,x):

self.data.append(x)

def addtwice(self,x):

self.add(x)

self.add(x)

# child extends base

class Child(Base):

def plus(self,a,b):

return a+b

oChild=Child()

oChild.add("str1")

oChild.add(999)

oChild.addtwice(4)

print(oChild.data)

print(oChild.plus(2,3))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529004.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529004.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529004.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux本地mysql與服務器同步數據_linux下指定mysql數據庫服務器主從同步的配置實例...

一、 概念:① 數據庫同步 (主從同步 --- 主數據庫寫的同時 往從服務器寫數據)② 數據庫同步 (主主同步 --- 兩臺數據庫服務器互相寫數據)二、 舉例數據庫服務器(A) 主數據庫 IP:192.168.1.134數據庫服務器(B) 主數據庫 IP:192.168.1.13…

c#二叉樹 取葉子節點個數_兩種類似但是原理不同的算法求二叉樹的所有葉子節點和...

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然后到中級難度,最后到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由于篇幅和精力有…

所有的service報紅但不報錯_從一個應用報錯來看centos系統的/tmp目錄自動清理規則...

概述分享最近應用碰到的一個奇怪bug,一開始以為是代碼上的問題,找了一段時間發現居然是因為系統的一個自動清理規則導致,下面一起來看看吧~一、應用報錯:logwire.core.exceptions.GeneralUnhandledException: 服務端未處理異常...…

python對瀏覽器的常用操作_Selenium元素的常用操作方法分析

本文實例講述了Selenium元素的常用操作方法。分享給大家供大家參考,具體如下:Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozill…

springboot中接口實例化_AngularJs中控制器的定義,實例化,作用域范圍

AngularJs中控制器的定義,實例化,作用域范圍基于AngularJS入門與進階(江榮波 著)這本書的筆記AngularJS 1.x的demoAngularJS1.x和Angular2,4,5是不一樣的兩個東西,構建方式,語法,都很多不同AngularJs控制器定義與實例化…

高斯核函數參數確定_高斯過程

之前看過高斯過程(GP),不過當時也沒太看懂,最近花時間認真研究了一下,感覺總算是明白咋回事了,本文基于回歸問題解釋GP模型的思想和方法。文中的想法是自己思考總結得來,并不一定準確,也可能存在錯誤性。為…

uniapp光標自動定義到文本框_特檢自動化行吊靜力檢測方案

主要測量功能使用徠卡測量開發的Windows版數據傳輸軟件,通過藍牙連接徠卡DISTO,經過簡單的測量周期設置,即可實現自動化的距離檢測。測量數據還可以輸出Excel,甚至可以實時發送至PC運行的第三方軟件中,這么強大的軟件還…

安裝python時需要勾選_一體化污水處理設備安裝時需要注意事項

一體化污水處理設備用于處理生活污水和低濃度有機污水,它基本上采用機電完全封閉的結構,不需要專業人員進行管理。它方便且易于清潔,因此引起了很多關注。一體化污水處理設備的安裝方法通常為三種:地埋式,地上式和半地…

oracle驅動maven報錯_在Maven倉庫中添加Oracle JDBC驅動

由于Oracle授權問題,Maven3不提供Oracle JDBC driver,為了在Maven項目中應用Oracle JDBC driver,必須手動添加到本地倉庫。一.首先要得到Oracle JDBC Driver2.通過Oracle的安裝目錄獲得,位置在“{ORACLE_HOME}jdbclibojdbc14.jar”二.手動安裝…

python3.6程序_python3.6如何生成exe程序

PyInstaller的原理簡介PyInstaller其實就是把python解析器和你自己的腳本打包成一個可執行的文件,和編譯成真正的機器碼完全是兩回事,所以千萬不要指望成打包成一個可執行文件會提高運行效率,相反可能會降低運行效率,好處就是在運…

java切片_ java中一個極其強悍的新特性Stream詳解(非常實用)

java8中有兩個非常有名的改進,一個是Lambda表達式,一個是Stream。如果我們了解過函數式編程的話,都知道Stream真正把函數式編程的風格引入到了java中。這篇文章由簡入繁逐步介紹Stream。一、Stream是什么從名字來看,Stream就是一個…

java獲取網絡圖片_有了這50套Java畢設項目(源碼 案例),offer拿到手軟,無償分享...

簡介:又到了開學季,不少人都很是煩惱,手把手教你做Java畢設項目,有教程視頻源碼100套隨意選擇,試試手!!列舉其中2個系統大綱在線考試系統1.綜述網絡考試系統的項目背景及國內外發展現狀&#xf…

python字典的建立和輸出_字典的創建和使用

直接創建d {age: 23, name: Daniel, sex: 1}輸出結果:{age: 23, name: Daniel, sex: 1}dict函數# 通過序列對建立字典vaulues [(name, Daniel), (age, 23), (sex, 1)]print dict(values)# 通過關鍵字建立字典print dict(nameDaniel, age23, sex1)# 如果 dict 不傳…

python字符串出棧方法_1.Python實現字符串反轉的幾種方法

1.Python實現字符串反轉的幾種方法題目: 在Python環境下用盡可能多的方法反轉字符串,例如將s "abcdef"反轉成 "fedcba"第一種:使用字符串切片result s[::-1]第二種:使用列表的reverse方法l list(s)l.reverse()result …

linux將日期和日歷信息追加到文件中_Linux常用指令

常用指令 1、幫助指令 man [指令或者配置文件] help 指令 2、文件目錄類指令 1、pwd 功能:顯示當前工作目錄的絕對路徑 2、ls [選項] [目錄或者文件] 功能:列出文件名和目錄使用:ls -l 以列表的形式顯示信息ls -a …

python播放音樂同步歌詞_使用Python下載歌詞并嵌入歌曲文件中的實現代碼

使用python掃描本地音樂并下載歌詞這次這個真的是干貨哦,昨晚弄了半晚上,,,,從8點吃完飯就開始寫,一直到了快12點才弄好,,,新手,傷不起呀。。。。先簡單的說下…

ajax mysql點贊_php+mysql結合Ajax實現點贊功能完整實例

phpmysql結合Ajax實現點贊功能完整實例131415161718192021222324252627282930313233343536//判斷是否已經存在了cookiefunction checkcookie(gindex){var thiscookie goodplus gindex;var mapcookie getCookie(thiscookie)if (mapcookie!null && mapcookie!"&q…

一個搜索框多個按鈕_網站搜索欄設計指南:要不要?怎么設計?

在網站的設計過程中,搜索欄是一個很容易被忽略的部分,但用戶卻依賴它來尋找特定的信息。由于搜索欄是網站中最常用的元素之一,所以搜索欄的設計對用戶體驗有著重要的影響。網站是否需要搜索欄?搜索欄使用背后的思維和心理是幫助用…

mysql的使用優化問題嗎_如何對 mysql 進行優化的問題

3641 天前mingszu-------------------------------------------------------------------------------------------------------------------------------------------------------------------| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Ca…

通過 xlsx 解析上傳excel的數據

一、前言 在前端開發中,特別是在后臺管理系統中,導入數據(上傳excel)到后端是是否常見的功能;而一般的實現方式都是通過接口將excel上傳到后端,再有后端進行數據解析并做后續操作。 今天,來記錄…