1. 程式人生 > >Python學習手冊之內部方法、操作符過載和物件生命週期

Python學習手冊之內部方法、操作符過載和物件生命週期

 在上一篇文章中,我們介紹了 Python 的類和繼承,現在我們介紹 Python 的內部方法、操作符過載和物件生命週期。

 檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/10016359.html

內部方法和操作符過載
內部的方法
Python 裡有一些特殊的方法,也就是以雙下劃線開頭並且以雙下劃線結尾的。它們可以是變數如 __doc__,也可以是方法如 __init__
它們常見用途是操作符過載。這意味著可以自定義類的操作符,允許在這些類上使用加減乘除等運算子
下面程式碼實現了__call__方法的物件,相當於過載了 (),可以實現呼叫功能。 實現非波納契數列的類

class Fib():
 def __call__(self, *args, **kwargs):
  ret = [1,1]
  num = int(args[0])
  if num == 1:
   return [1,]
  else:
   while len(ret)< num:
    ret.append(ret[-1]+ret[-2])
   return ret

fib = Fib()
print(fib(7))

執行結果:

>>>
[1, 1, 2, 3, 5, 8, 13]
>>>
斐波那契數列,是數學上一個無窮數列。其形式為
11235813…… 從第三項開始,每一項都是前兩項之和。

類運算過載的方法:
__sub__ 表示運算子 -
__mul__ 表示運算子 *
__truediv__ 表示運算子 /
__floordiv__ 表示運算子 //
__mod__ 表示運算子 %
__pow__ 表示運算子 **
__and__ 表示運算子 &
__xor__ 表示運算子 ^
__or__ 表示運算子 |
表示式 x + y 會被 Python 轉換成 x.__add__(y)。但是,如果 x 沒有實現 __add__ 方法並且 xy 是不同的型別,那麼會呼叫 y.__radd__(x)
對於上面提到的所有方法,都有相等的新增 r 字首的方法。

class Foo:
 def __init__(self,text):
  self.text = text

 def __mul__(self, other):
  line = "=" * len(other.text)
  return "\n".join([self.text,line,other.text])

msg = Foo("Hello")
hello = Foo("I like Python!")
print(msg * hello)

執行結果:

>>>
Hello
==============
I like Python!
>>>
上面例子中,我們定義了類 Foo 的一個乘法方法。

Python 同樣提供了資料比較方面的方法。
__it__ 表示運算子 <
__le__ 表示運算子 <=
__eq__ 表示運算子 ==
__ne__ 表示運算子 !=
__gt__ 表示運算子 >
__ge__ 表示運算子 >=
如果類沒有實現 __ne__ ,則返回 __eq__ 相反的值。其他運算子之間沒有這樣的關係。

class FooString():
 def __init__(self, name):
  self.name = name

 def __lt__(self, obj):
  return self.name == obj.name

a = FooString("Python")
b = FooString("Html")
print(a < b)

執行結果:

>>>
False
>>>

類中還有一些方法:
__len__ 可用來做 len()
__getitem__ 可用來做鍵值讀取,適用於 [] 運算子。
__setitem__ 設定給定值的值。
__delitem__ 刪除給定鍵對應的元素
__iter__ 用來遍歷物件
__contains__ 用來做 in 操作
還有許多其他的神奇方法,我們在這裡就不一一談論了,例如__call__ 用於將物件作為函式呼叫, __init____str__ 等等用於將物件轉換為 Python 基礎資料型別。

#把一個類做成一個字典

class Foo():
 def __init__(self):
  self.data = {}
 def __getitem__(self, key):
  print('__getitem__', key)
  return self.data.get(key)

 def __setitem__(self, key, value):
  print('__setitem',key, value)
  self.data[key] = value

 def __delitem__(self, key): #觸發del
  print('__delitme__', key)

obj = Foo() #例項化Foo
obj['name'] = 'Python' #執行__setitem__
print(obj['name']) #執行__getitem__

del obj["name"]

執行結果:

>>>
__setitem name Python
__getitem__ name
Python
__delitme__ name
>>>
鍵值讀取函式 __getitem__ 還可以根據表示式返回字典中的 key__setitem__ 設定 key 對應的 value 值。

物件生命週期

一個物件會經歷三個生命週期:建立,操作,銷燬。
物件生命週期的第一階段是它類變數和方法的定義。
接下來下一階段是這個例項的例項化。當 __init__ 被呼叫是,記憶體分配給儲存例項。在此之前,呼叫類的 __new__ 方法,這通常僅在特殊情況下會被重寫。在此以後,該物件就可以使用了。

現在,其他程式碼可以通過呼叫物件上的函式或訪問其屬性與物件進行互動。最後它使用完畢並可被銷燬。

當一個物件被銷燬時,分配給它的記憶體會被釋放,並可以用於其他目的。
當物件的引用計數達到零時,物件將銷燬。引用計數是指引用物件的變數和其他元素的數量。如果沒有任何變數引用它(它的引用計數為零),意味著沒有任何東西可以與其互動,因此可以安全地刪除它。在此也可以被刪除。del 語句將物件的引用計數減少一個,這通常會導致物件被刪除。del 語句呼叫物件的方法 __del__
在不再需要物件是刪除物件的過程稱為垃圾收集。物件的引用計數在分配新名稱或放在容器 (列表、元組或字典) 中時會增加。當使用 del 刪除物件時,物件的引用計數會減少。當物件的引用計數達到零時,Python 會自動刪除它。

a=1       # 物件 1 被 變數a引用,物件1的引用計數器為1
b=a       # 物件1 被變數b引用,物件1的引用計數器加1
c=a       # 物件1 被變數c引用,物件1的引用計數器加1
del a     #刪除變數a,解除a對1的引用
del b     #刪除變數b,解除b對1的引用
del c     #刪除變數C,解除C對1的引用
上面的例子,建立了一個含 1 的物件,物件的計數器加了 3 次,然後物件的計數器減了三次。這時該物件會被自動記憶體管理銷燬。
像 C 這樣的低階語言沒有這種自動記憶體管理系統。

“數學就是用來把七成人篩出去的。”

相關推薦

Python學習手冊內部方法操作符過載物件生命週期

 在上一篇文章中,我們介紹了 Python 的類和繼承,現在我們介紹 Python 的內部方法、操作符過載和物件生命週期。  檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/10016359.html 內部方法和操作符過載內部的方法Python 裡有一些特殊的方法,也

Python學習手冊數據封裝方法靜態方法

tle tro 變量 無法 code att span method 私有 在上一篇文章中,我們介紹了 Python 的內部方法、操作符重載和對象生命周期,現在我們介紹 Python 的數據封裝、類方法和靜態方法。查看上一篇文章請點擊:https://www.cnblogs

Python學習手冊 Python Python 程式設計規範函式引數

在上一篇文章中,我們介紹了 Python 的的正則表示式使用示例,現在我們介紹 Python 之禪、 Python 程式設計規範和函式引數。檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/10040430.html Python 之禪讓程式能夠正確執行只是成為一個優

Python學習手冊元組拆包三元運算子 else 語句深入

在上一篇文章中,我們介紹了 Python 之禪、 Python 程式設計規範和函式引數,現在我們介紹 Python 的元組拆包、三元運算子和對 Python 的 else 語句深入講解。檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/10052453.html 元組

python學習筆記split()方法與with

很好 self 所有 簡單 car 版本 指定 操作 發生 Python split()方法 以下內容摘自:http://www.runoob.com/python/att-string-split.html 描述 Python split()通過指定分隔符對字符串進行切片

Python學習手冊控制結構(一)

布林比較布林Python 有許多種資料型別,其中一種型別叫布林,英文表示為 Boolean。它包含兩個值:True 和 False。有兩種方式可以宣告資料型別是布林型。一種是直接宣告,另外一種是通過值比較產生,比如等於運算子==。 >>> boolean = True >>

Python學習手冊控制結構(二)

在上一篇文章中,我們介紹了Python的一些控制結構,現在我們繼續介紹剩下的 Python 控制結構。檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/9972078.html 列表(List)列表是一種用於儲存一系列有序的集合,你可以想象你有一張購物清單,上面列出了

Python學習手冊Python異常檔案

 在上一篇文章中,我們介紹了 Python 的函式和模組,現在我們介紹 Python 中的異常和檔案。  檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/9963920.html 異常和檔案 異常 異常也叫例外。在之前的幾篇文章中

Python學習手冊Python異常和文件

字節流 自定義 ror happy 異常處理 但是 spa 方向 execute 在上一篇文章中,我們介紹了 Python 的函數和模塊,現在我們介紹 Python 中的異常和文件。 查看上一篇文章請點擊:https://www.cnblogs.com/dustman/

Python學習手冊資料型別

 在上一篇文章中,我們介紹了 Python 的異常和檔案,現在我們介紹 Python 中的資料型別。 檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/9979931.html 資料型別None 型別None 型別是 Python 的特殊型別,它

Python學習手冊正則表示式元字元

 在上一篇文章中,我們介紹了 Python 的資料封裝、類方法、靜態方法和屬性函式,現在我們介紹 Python 的正則表示式和元字元。檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/10019973.html 正則表示式正則表示式是一種強大的字串

Python學習手冊正則表達式示例--郵箱地址提取

nbsp logs 電子 edi tro 點擊 用戶名 手冊 com 在上一篇文章中,我們介紹了 Python 的捕獲組和特殊匹配字符串,現在我們介紹 Python 的正則表達式使用示例。查看上一篇文章請點擊:https://www.cnblogs.com/dustman/

Python學習手冊__main__ 模組,常用第三方模組打包釋出

在上一篇文章中,我們介紹了 Python 的 元組拆包、三元運算子和對 Python 的 else 語句進行了深入講解,現在我們介紹 Python 的 __main__ 模組、常用第三方模組和打包釋出。檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/10057482.

python學習筆記資料型別字元編碼檔案處理

    1、資料型別   1、數字(int,float)     整形(int):定義 age=20  #本質age=int(20)     浮點型別:salary=3000.3 #本質salary=float(3000.3)     還有不常用的長整型、複數。   2、字串

JavaScript高級程序設計學習(三)變量作用域內存問題

則表達式 基本數據類型 處理 文章 fir 數據類型 進入 AR 特點 這次講的主要是變量,作用域和內存問題。 任何一門編程語言,都涉及這三個。 變量,比如全局變量,局部變量等,作用域,也分全局作用域和方法作用域,內存問題,在java中就涉及到一個垃圾回收的問題,由於j

python學習二(for迴圈下標切片字串操作)

1、for迴圈 import time name = "shixiaopeng" for temp in name:         print(temp)         time.sleep(1) 2、下標和切片 name="shixiaopeng" 取下標為0的值,n

學習筆記執行緒Thread類執行緒終止相關整理(下)——執行緒異常&JVM停止

提到執行緒的中斷在某些情況下會丟擲InterruptedException異常,最終導致執行緒的終止。其實,執行緒也有可能由於其他異常原因造成終止,在某些情況下為了做一些妥善的處理,我們需要捕獲這些異常情況。看下面程式碼,覺得會怎樣? 1 2 3 4 5

少說話多寫程式碼Python學習017——字典的方法(itemspop)

  items方法將字典的所有項以列表方式返回,列表中每一項都表示為(鍵,值)對形式,但對字典的項的次序沒有什麼規律。 #items方法 d={'title':'繞口令:喇嘛和啞巴',    'content':'打南邊來了個啞巴,腰裡別了個喇叭;打北邊來了個喇

少說話多寫程式碼Python學習019——字典的方法(updatevalues)

update方法 利用一個字典A去更新另一個字典B。A的項會新增到B中,如果存在相同鍵,則A會覆蓋B的這個鍵。 #update 方法 d={     'name':'楊友山',     'blog地址':'https://blog.csdn.net/y

少說話多寫程式碼Python學習018——字典的方法(popitemsetdefault)

popitem方法 popitem其實和pop方法沒什麼兩樣,雖然解釋說pop是彈出字典的最後一項,popitem彈出的是字典的隨機項。但是字典是一個連結串列結構,哪裡有最後一項和第一項呢?不管怎麼說,我們可以看看popitem的用法。 #popitem d={} d={'詩仙':'李白',