來一點Python面向對象第一級進階的東西

2021-01-07 Hewmbj

isinstance和issubclass

# isinstance(obj,cls) 檢查obj是否是類cls的對象class Foo:def __init__(self,name):self.name = nameclass Clss: def __init__(self,name):self.name = namesb = Foo('ssb')print(isinstance(sb, Foo)) # 判斷sb是否是Foo的對象sc = Clss('ak')print(isinstance(sc, Foo)) # 判斷sc是否是Foo的對象# 返回值# True# False

# issubclass(sub, super)檢查sub類是否是super的派生類classFoo:def __init__(self):passclass Sb(Foo): def __init__(self): passprint(issubclass(Sb, Foo)) # 判斷Sb是否是Foo的子類# 結果# True

反射

反射定義:反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。這一概念的提出很快引發了計算機科學領域關於應用反射性的研究。它首先被程序語言的設計領域所採用,並在Lisp和面向對象方面取得了成績。

python面向對象中的反射:通過字符串的形式操作對象相關屬性.python中的一切事物都是對象(都可以使用反射)

四個可以實現自省的函數

下列方法適用類和對象(一切皆對象,類本身也是一個對象)

hasattr

defhasattr(*args, **kwargs):# real signature unknown""" Return whether the object has an attribute with the given name. This is done by calling getattr(obj, name) and catching AttributeError. """ pass

getattr

def getattr(object, name, default=None): # known special case of getattr"""getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y. When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case. """ pass

setattr

defsetattr(x, y, v):# real signature unknown; restored from __doc__""" Sets the named attribute on the given object to the specified value. setattr(x, 'y', v) is equivalent to ``x.y = v'' """ pass

delattr

defdelattr(x, y):# real signature unknown; restored from __doc__""" Deletes the named attribute from the given object. delattr(x, 'y') is equivalent to ``del x.y'' """ pass

四方法演示

1 class Foo:2 f = 'abc' # 類的靜態變量3 def __init__(self, name, pwd):4 self.name = name5 self.pwd = pwd6 def exex(self):7print('hi {}'.format(self.name))8return'ssd'9 class Ak:10 f = 'ssd'11 def __init__(self):12 pass13 sb = Foo('張飛', 38)14 ak = Ak()1516 # hasattr檢查是否含有某些屬性1718print(hasattr(sb, 'name')) # 檢查對象sb中是否含所有name屬性 屬性名以字符串形式顯示19print(hasattr(ak, 'name')) # 檢查對象ak中是否含所有name屬性 屬性名以字符串形式顯示20 # 結果21 # True22 # False23 24 # getattr獲取屬性 有此對象屬性就輸出沒有就報錯,可以定製報錯形式,使其不報錯2526print(getattr(sb, 'name')) # 獲取對象的屬性 getattr函數 括號第一位填對象 第二位填屬性27print(getattr(sb, 'exex')) # 獲取動態屬性28print(getattr(sb,'exex')()) # 加括號可以直接調用29 # print(getattr(sb,'rr')) # 如果沒有此屬性將報錯30print(getattr(sb,'rr','不存在')) # 如果沒有此屬性將報錯 可以定製報錯形式使其不報錯3132 # setattr設置屬性 原則:如果原本含有此屬性便修改其屬性,如果不存在此屬性,便添加此屬性3334 setattr(sb, 'sb', 27) # 為對象sb增加屬性 屬性名為sb 屬性值為2735print(sb.__dict__)36 # 結果 {'name': '張飛', 'pwd': 38, 'sb': 27}37 setattr(sb, 'ak117', 38) # 為對象sb增加屬性 屬性名為ak117 屬性值為3838print(sb.__dict__)39 # 結果:{'name': '張飛', 'pwd': 38, 'sb': 27, 'ak117': 38}40 setattr(sb, 'ak117', 39) # 對對象sb修改屬性 將屬性為ak117的屬性值修改為3941print(sb.__dict__)42 # 結果 {'name': '張飛', 'pwd': 38, 'sb': 27, 'ak117': 39}43 setattr(sb, 'show_name', lambda self: self.name+'uu') # 為對象增加動態方法44print(sb.show_name(sb))45 # 結果:張飛uu46 47 # delattr刪除屬性 有就刪除沒有就報錯4849 delattr(sb, 'ak117') # 刪除 對象sb的ak117屬性50print(sb.__dict__)51 # 結果{'name': '張飛', 'pwd': 38, 'sb': 27, 'show_name': <function <lambda> at 0x002DC660>}52 # delattr(sb, 'rrr') # 如果不存在此屬性將會報錯53 # print(sb.__dict__)四方法演示

類也是對象

classFoo:name = '38'deffunc():return'AK117' @staticmethoddeffunct():return'funct'print(getattr(Foo, 'name'))print(getattr(Foo, 'func')())print(Foo, 'funct')

反射當前模塊成員

import sysdef s1():print('s1')defs2(): print('s2')this_module = sys.modules[__name__]print(hasattr(this_module, 's1'))print(getattr(this_module, 's2'))

__str__和__repr__

# 改變對象的字符串顯示__str__,__repr__

# 自定製格式化字符串__format__

__str__ 使用方法及含義

# __str__ 使用方法及含義classHuman:def __init__(self, name):self.name = name # 2試驗 def __str__(self): # return'我是str方法,列印對象時調用的就是我,我是存在於object類中' # 1試驗return'my name is %s' % self.name # 2試驗 解釋 %s相當於str() 實際上走的是__str__方法# a = Human() # 1試驗# print(a) # 1試驗# 結果:我是str方法,列印對象時調用的就是我,我是存在於object類中 # 1試驗a = Human('明明') # 2試驗print(a) # 2試驗# 結果 my name is 明明 # 2試驗

__repr__使用方法及含義

# __repr__使用方法及含義class Hunman:def __init__(self, name, age):self.name = nameself.age = age def __repr__(self):return str(self.__dict__)a = Hunman('Mr.He','Twenty-two')print(repr(a)) # 同理repr函數也是調用內置方法 __repr__print('>>>%r'% a) # %r 相當於 repr() 或者 __repr__# 結果# {'name': 'Mr.He', 'age': 'Twenty-two'}# >>>{'name': 'Mr.He', 'age': 'Twenty-two'}# 如果不使用__repr__方法,則返回內存地址

__str__ and __repr__關係

# __str__ and __repr__ relationshipclass Human:def __repr__(self):return str(12345)a = Human()print('%s' % a)# 結果:12345# 原本%s 相當於 __str__方法,但類中無此方法,正常情況下是該報錯的。# 但可以正常輸出結果》結論:__repr__是__str__的備胎。# 如果類中無__str__便去查看父類是否含有,一個父類一個父類找上去直到找到object類中。# 如果沒有便找__repr__代替

__len__

# __len__方法class A:def __init__(self): self.a = 1 self.b = 2 # def __len__(self): # returnlen(self.__dict__)s = A()print(len(s)) # 直接調用了類中的__len__方法# 注意 有些方法在object類中是沒有被收錄的。# 故如果不構建__len__方法,來讀取一個int類型的數據的長度便會報錯# 錯誤類型為:TypeError: object of type'A' has no len()

__del__(析構函數)

析構方法,當對象在內存中被釋放時,自動觸發執行。

註:此方法一般無須定義,因為Python是一門高級語言,程式設計師在使用時無需關心內存的分配和釋放,因為此工作都是交給Python解釋器來執行,所以,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。

# __del__class Currency:def __del__(self):print('執行了我,刪除了你要刪除的數據')a = Currency()del a # 即執行了這個方法,又刪除了變量

__call__

# __call__class Human:def __init__(self, name):self.name = name def __call__(self, *args, **kwargs):'''此處可以寫一些小方法''' print('abc')a = Human('Mr.he')a()# 結果:abc

#python#

相關焦點

  • Python基礎知識——python面向對象的解釋型計算機程式語言
    python面向對象的解釋型計算機程式語言。高級計算機程式語言,分為:解釋型程式語言和編譯型程式語言Python屬於解釋型的 Java (說一句翻譯一句),把寫好的高級語言程序給用戶,同時用戶還需要有一個翻譯軟體,來翻譯並執行高級語言程序
  • 面向對象特性之三:多態(Python進階教程)
    今天我們要講一講面向對象的第三個特性:多態;什麼叫做多態?從字面意思上理解,就是一個函數具有多種形態。本質上其實就是同一操作方法作用於不同的對象時,有著不同的解釋,執行不同的邏輯,產生不同的結果。今天我們還是用例子來說明在Python中多態的使用方法、注意事項和使用的優點。
  • opencv-python獲取圖像:面向對象與面向過程
    2.Lenna是個美女,對於圖像處理界的研究者(大部分都是男性)來說,美女圖可以有效地吸引他們來做研究。下面是分別用面向過程與面向對象的編程方法實現讀取本地圖像和打開攝像頭兩段代碼:# -*- coding: utf-8 -*-"""面向過程的編程方法,用函數把解決問題的步驟一步一步實現。
  • Python面向對象程式語言
    Python (發音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一種面向對象的解釋性的電腦程式設計語言,也是一種功能強大而完善的通用型語言,已經具有十多年的發展歷史面向對象————Python即支持面向過程的編程也支持面向對象的編程。在「面向過程」的語 言中,程序是由過程或僅僅是可重用代碼的函數構建起來的。在「面向對象」的語言中,程序是由數據和功能組合而成的對象構建起來的。與其他主要的語言如 C++和Java相比,Python以一種非常強大又簡單的方式實現面向對象編程。
  • python面向對象,小白從零開始,python基礎入門,你會了嗎?
    Python,是一種面向對象的解釋型電腦程式設計語言,以簡單、易學、速度快等優點,是大部分想進入IT行業的從業人的選擇。IEEE發布2017年程式語言排行榜:Python超過JAVA程式語言排名第一。所以Python非常熱門的程式語言!
  • python入門——面向對象編程基礎到進階之枚舉類Enum
    ## 文章目錄 面向對象編程 @property 使用枚舉類 # 面向對象編程 ## @property 為了避免實例對象屬性的值被隨意修改
  • (視頻分享) PHP面向對象視頻教程 (30集全)
    PHP面向對象視頻教程 (30集全),學習php,肯定要學習面向對象,視頻教程大同小異,小編覺得此視頻教程講師講解思路清晰,比較全面,足以滿足初學者們學習了,現在分享給大家,有需要的可以保存後學習,視頻教程是用來學習的,不是用來收藏的哈
  • 從零入門量化交易系列-python的面向對象
    1、面向對象基礎概念類(Class): 用來描述具有相同屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。
  • python面向對象三大特徵
    大概所有變成初學者初學者最頭疼的第一道坎就是面向對象的理解封裝從封裝本身去理解 就是把小貓小狗用袋子裝起來,然後把袋子的小口封上私有化方法:方法的私有化可以保護好一些核心的代碼,可以添加條件,是別人不能不滿足條件的更改,進行代碼的保護,python
  • Python入門基礎之面向對象二:類和實例、方法
    前面一篇文章我介紹了python面向對象的基本知識,連結在最下面。初步解釋了面向對象和面向對象的優點,今天就開始正式用代碼來展現面向對象。1、利用class創建類Python中,創建類的語句是如下所示先解釋一下,class後面跟的是類名,括號裡面是基類(也成為父類)python3中默認繼承object。
  • 深入理解Python 類型和對象
    有類型 type - 每個對象有一個確定的類型. 例如對象2的類型是 int ,對象 "joe" 的類型是 string. 有一個或多個 bases. 並非所有對象都有bases,一些特別的對象會有. A base 類似於面向對象術語中的超類或基類。
  • python面向對象之異常處理
    捕獲異常 2.1 簡單的捕獲異常語法 在程序開發中,如果 對某些代碼的執行不能確定是否正確,可以增加 `try(嘗試)` 來 捕獲異常 捕獲異常最簡單的語法格式:```pythontry: 嘗試執行的代碼except: 出現錯誤的處理``` `try
  • python高級進階 002第一個pyqt5程序
    QApplication簡單理解成程序的進程,代碼實例化為app這個對象。app.exec_()主要作用是用死循環來監聽界面的關閉按鈕等界面控制項等事件__name__在本文件運行的時候,結果就是__main__使用__name__==『__main__『來模擬python程序主入口為了使得我們能夠對qtdesigner設計後生成的代碼更加熟悉,我們今後會更多直接使用純pyqt5代碼來編寫程序,當然,在熟悉以後,我們可以直接使用qtdesigner直接快速圖形化開發界面
  • python面向對象中的self,cls,staticmethod,classmethod
    先給大家拜年,新年第一篇繼續我複習面向對象的知識,這次打算說說我疑惑挺久的self,cls,staticmethod,classmethod是幹嘛的
  • Python高級進階 007 pyqt5消息盒子QMessageBox
    利用傳過來的事件對象我們通過輸出的形式,看到事件對象的屬性和方法,猜測到具體的調用方法。if __name__=="__main__": app=QApplication(sys.argv) mc=MyClass() app.exec_()相關文章:python高級進階#001
  • 史上最全 Python 面向對象編程
    面向對象編程:1. 導入各種外部庫2. 設計各種全局變量3. 決定你要的類4. 給每個類提供完整的一組操作5. 明確地使用繼承來表現不同類之間的共同點6. 根據需要,決定是否寫一個main函數作為程序入口面向對象編程中,將函數和變量進一步封裝成類,類才是程序的基本元素,它將數據和操作緊密地連結在一起,並保護數據不會被外界的函數意外地改變。類和和類的實例(也稱對象)是面向對象的核心概念,是和面向過程編程、函數式編程的根本區別。
  • 如何理解python中的類和對象?
    在我們的python編程中,也是有類和對象的,比如我們知道的數據類型就可以看做是類,數字類,字符類,列表類,函數類;實際的1,2,3數字就是數字對象了,"abc"等就是字符對象了,這些都是python中提供的對象。除了提供的對象,其實我們也可以自己來創建對象,這裡我們就用一個比較好理解的例子來說:假設我們要做一個彈球遊戲,這裡面有三個不同顏色大小的球和一個球拍。
  • Python3 量化分析筆記小白到破產-列表進階 切片組合
    文:藍兔子讀難NOTES圖: 配圖 來源於網絡Python3 量化分析從小白到破產筆記列表的進階 切片與組合編碼:0009在前面的內容中,我們說人人都愛列表,老闆也動不動就讓你列個表。我們講了如何列出一個表,如何對表中的元素進行:增、刪、改等操作。這篇文章的內容,我們將進行更高階一點的操作。
  • Python 對象的身份迷思:從全體公民到萬物皆數
    對象們分屬在五大部落裡(數字、字符串、列表、元祖、字典),各有所長,各司其職,協作共處,通婚繁衍。還有一點難得的是,他們沒有受到愚民政策的對待,全民都享有思想自由,還習得了超便利的自省能力。人能自知,這能力彌足珍貴。雖然在這個世界裡,不會時常出現崗哨攔阻,但在任何有需要的時候,他們都可以自證清白,id()和type()是一種通行語言,你不需要翻譯來對接。
  • python核心部分創建對象中各種名詞的定義及用法
    學了之前的基礎之後你會發現你基本上可以寫出很多小程序來了,包括用序列,字典,數字,字符串來創建函數,基本上可以完成你遇到的問題。但是python被稱為面向對象的語言,所以創建對象才是python的核心部分,我們今天就走進python的核心部分-創建對象。接下來幾天的章節非常重要非常核心,非常重要非常核心,非常重要非常核心,重要的事情說是三次。首先說一下幾個名詞的定義,方便你在以後的學習中理解。