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

2020-12-17 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#

相關焦點

  • blender python類別
    Blender python 使用面向對象的方法處理其數據。對象類包含泛型屬性,如對象的位置。然後,它使用它的數據屬性來使用特定於對象類型的類來存儲對象特定數據,每個數據類型都是 ID 的子類bpy.data.objects是 Object類實例的列表。
  • 介紹一下什麼是python(瘋狂Python)
    是一種面向對象的動態類型語言,最初被設計用於編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越多被用於獨立的、大型項目的開發。是一種解釋型腳本語言。2.去python官網就能下載你所需要安裝的版本,安裝方法也可以百度一下(或者關注我私信我),讓你眼花繚亂的各種安裝介紹,保證你自己能安上。(我用的版本是Winodws版本)5.
  • 最常見的 35 個 Python 面試題及答案(2018 版)
    面向對象4. 語法簡潔5. 開源6.深拷貝是將對象本身複製給另一個對象。這意味著如果對對象的副本進行更改時不會影響原對象。在 Python 中,我們使用 deepcopy()函數進行深拷貝,使用方法如下:深拷貝-Python 面試問題及答案淺拷貝是將對象的引用複製給另一個對象。
  • Python基礎進階之海量表情包多線程爬蟲功能的實現
    這篇文章主要介紹了Python基礎進階之海量表情包多線程爬蟲,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑑價值,需要的朋友可以參考下一、前言在我們日常聊天的過程中會使用大量的表情包
  • python爬蟲整個體系闡述,基礎到進階
    這裡為大家聊聊python爬蟲的整個體系。或許你會知道該怎麼一點點去學習。看上述搜索結果,除了wiki相關介紹外,爬蟲有關的搜索結果全都帶上了Python,前人說Python爬蟲,現在看來果然誠不欺我~爬蟲的目標對象也很豐富,不論是文字、圖片、視頻,任何結構化非結構化的數據爬蟲都可以爬取,爬蟲經過發展,也衍生出了各種爬蟲類型:·
  • 開課吧:Python是什麼意思?為什麼有那麼多人學Python?
    PythonPython 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。python非常容易上手,而且能幹很多事情,WEB開發,機器學習人工智慧,數據分析,量化投資,爬蟲等,基本可以應用到各行各業,而且大家都在做基於PYTHON的庫,使得PYTHON語言變成一門直接拿來就能用的語言,更像一種工具了,比如機器學習,可能理論很複雜,但是實際在PYTHON中僅僅幾行代碼就能實現,不用花太多時間用在碼代碼上面,python 現在是越來越火
  • 3分鐘了解python!新手必看
    一、Python是什麼語言,python是什麼類型的語言?Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum於1989年底發明,第一個公開發行版發行於1991年。
  • 「python學習手冊-筆記」003.數值類型
    小數python2.4之後引入了小數這種數據類型,正式名稱叫做Decimal. 需要注意的是python中的Decimal類型和浮點數不是一個東西. 小數很像浮點數,但是小數有固定的位數和小數點.比如,我們可以使用小數對象實現一個只有兩位小數位精度的浮點數.
  • Java基礎入門篇之面向對象和類的定義
    Java基礎入門篇之面向對象和類的定義 本文主要介紹了面向對象概念,面向對象的三個特點封裝性、繼承性、多態性。類的定義和創建對象與使用。詳細的介紹了怎麼去定義一個類,通過案例來理解怎麼去定義的。對象的創建與使用介紹了使用的格式,通過創建對象後,可以通過對象的引用來訪問對象的成員。
  • Python開發簡單爬蟲【學習資料總結】
    將這些Handler傳送給urllib2的build_opener方法創建一個opener對象,再傳給urllib2的install_opener方法,urllib2這個模塊就具備了進行特殊情景處理的能力。
  • python解釋器到底是什麼?
    有很多入門學習python的同學都沒有搞清python解釋器是怎麼回事,所以今天在這裡追根溯源的解釋一下。 計算機程式語言 從計算機程式語言說起,它主要分為三類:機器語言、彙編語言、高級語言。
  • Python2 已終結,入手Python 3,你需要這30個技巧
    還有一個有用的功能就是調取之前的命令輸出,這裡的輸入和輸出其實都是對象。例如,你可以用 Out[3] 來調取第三條命令的輸出。你可以用下面這條命令安裝 IPython:pip3installipython4.
  • Python 3.8.0來了!
    任何實現可調用對象的擴展類型均可使用此協議。 此特性目前為暫定狀態,計劃在 Python 3.9 將其完全公開。 具有外部數據緩衝區的 pickle 協議 5 當使用 pickle 在 Python 進程間傳輸大量數據以充分發揮多核或多機處理的優勢時,非常重要一點是通過減少內存拷貝來優化傳輸效率,並可能應用一些定製技巧例如針對特定數據的壓縮。
  • Python真的值得學習嗎
    是一種動態的、面向對象的腳本語言。最初是用來編寫自動化腳本,隨著版本的不斷更新和語言新功能的添加,越來越多的時候,被用於獨立或者大型項目的開發。 1989年,Guido van Rossum在參加設計ABC(一種教學語言)後,萌生了想要開發一種新的計算機高級語言的想法。
  • python:控制流程 - for迭代循環
    for迭代的要點for 後面需要接上可迭代對象for會依次取出可迭代對象中的元素5.continue的用法:continue和break類似,但是continue不會終止循環,而是結束本次循環135解析: 如果是可變對象,一定不要再循環的往裡面插入東西。判斷一個對象是不是可迭代對象:1.直接放到for裡面。
  • Java咖啡館(7)——大話面向對象
    為了解決軟體開發的難題,計算機科學家發明了彙編語言,通過一些助記符來減輕二進位編碼的開發壓力。這的確是行之有效的方法,直到現在,程式設計師在開發中還常常使用嵌入式彙編來提高軟體運行速度,遊戲引擎更是如此。然而,彙編語言太依賴程式設計師的素質,而且無法適應大規模的開發。
  • 學Python有意思嗎?自學可以出去工作嗎?
    由於本人從事Python已經快9年了,所以在這方面還是有一點的見解,下面就談談我的看法:大學的時候我曾自己接觸過幾門語言,有最經典的C,比之難點的C++、java也都了解一點。但是在此之前從未系統的學習過一門計算機語言。
  • 推薦7款好用的Python工具
    但是,能否充分利用數據取決於是否有合適的工具來清理、準備、合併並正確分析。PuLP是一個用python編寫的線性編程建模器。PuLP可以生成LP文件並使用高度優化的解算器,GLPK,COIN CLP / CBC,CPLEX和GUROBI來解決這些線性問題。
  • 聊聊學python轉行、具體學習方法、自學python用於辦公、寫爬蟲等...
    那今天就來說說學python這件事兒吧,從三個方面來說:第一,學了python之後轉行找工作的問題;第二,具體的學習方法;第三,講講學了python之後應用於辦公自動化和寫爬蟲。4600字。關於恰飯:不用猜了,這篇依舊沒有廣告。
  • 如何在Visual Studio調整python可啟動文件
    >python類和對象在Visual Studio開發工具中,創建python應用程式,默認有個python文件,這個為主啟動文件;如果再創建一個python文件,想要運行這個文件,需要將其設置為主啟動文件,就可以調試了。