如何在python中使用魔法函數-創(chuàng)新互聯

本篇文章為大家展示了如何在python中使用魔法函數,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

創(chuàng)新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站建設、成都做網站、企業(yè)官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的興山網站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

python的幾個魔法函數

__repr__

Python中這個__repr__函數,對應repr(object)這個函數,返回一個可以用來表示對象的可打印字符串.如果我們直接打印一個類,向下面這樣

class A():
  def __init__(self,name=None,id=1):
    self.id=id
    self.name=name

if __name__ == '__main__':
  a=A()
  print(a)

輸出結果

<__main__.A object at 0x0000018DF8E7EAC8>

不是很友好,返回了一個對象的內存地址。我們改成下面再次輸出

class A():
  def __init__(self,name=None,id=1):
    self.id=id
    self.name=name
  def __repr__(self):
    return "進入函數"

if __name__ == '__main__':
  print(A())

輸出結果

進入函數

__str__

class A():
  def __init__(self,name=None,id=1):
    self.id=id
    self.name=name
  def __str__(self):
    return "進入函數"

if __name__ == '__main__':
  print(A())

輸出結果

進入函數

比較repr和str

上面我們發(fā)現在print的時候,兩個魔法函數顯示的效果是一樣的,那這兩個魔法函數區(qū)別在哪呢,__repr__和__str__這兩個方法都是用于顯示的,__str__是面向用戶的,而__repr__面向程序員。在print的時候兩者項目一樣,但是在交互命令下__repr__同樣有著print的效果,但是__str__還是輸出對象內存地址。也就說在交互式命令下我們可以看到其效果,另外__str__ 方法其實調用了 __repr__ 方法。

__getitem__

如果在類中定義了getitem__()方法,那么他的實例對象(假設為A)就可以這樣A[key]取值。當實例對象做A[key]運算時,就會調用類中的__getitem()方法。

class A():
  def __init__(self,name=None,id=1):
    self.id=id
    self.name=name
  def __repr__(self):
    return "進入函數"
  def __getitem__(self, item):
    return item
if __name__ == '__main__':
  a=A('lisa','123')
  print(a['name'])
  print(a[124])

輸出

name
124

實例對象的key不管是否存在都會調用類中的__getitem__()方法。而且返回值就是__getitem__()方法中規(guī)定的return值。也就是說如果getitem里的方法寫的不好就沒有了意義了。我們修改下代碼,改變getitem的return的值

class A():
  def __init__(self,name=None,id=1):
    self.id=id
    self.name=name
  def __repr__(self):
    return "進入函數"
  def __getitem__(self, item):
    return self.__dict__[item]
if __name__ == '__main__':
  a=A('lisa','123')
  print(a['name'])
  print(a[123])

輸出

lisa
keyerror:123

輸出了lisa和一個異常,改后的getitem做了什么事呢,self.__dict__,是獲取當前實例的所有屬性的字典格式,后面的[item]就是取其對于的鍵值,這里我傳了個name,實際就是取name屬性的值也就是lisa。對于123因為不存在這個屬性所有報錯了。這也是字典內部實現的一部分。

再來看一個例子,代碼里已經加入了注釋:

import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
# 具名元組動態(tài)創(chuàng)建一個類Card,并含有兩個屬性rank和suit
# 用以構建只有少數屬性但是沒有方法的對象

class FrenchDeck:
  ranks = [str(n) for n in range(2, 11)] + list('JQKA') # 撲克牌2到A組成的列表
  suits = 'spades diamonds clubs hearts'.split() # 四種花色

  def __init__(self):
    self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] # 笛卡爾積,13*4=52(除去兩個王)

  def __len__(self):
    return len(self._cards)

  def __getitem__(self, position):
    # 調用f[0]時會進入
    return self._cards[position]
if __name__ == '__main__':
  f = FrenchDeck()

  print(f[0])
  # 在這里f[0]實際是f.__getitem__(0)

輸出

Card(rank='2', suit='spades')

我們發(fā)現這個例子中還有一個__len__,那這個方法是干嘛的呢,我們繼續(xù)往下看

__len__

在上面的例子中我們使用該方法,這個方法會在什么情況下發(fā)生呢,一個小例子來說明。

class B():

class B():
  def __init__(self):
    self.a_list = range(10)
  def __len__(self):
    return len(self.a_list)
if __name__ == '__main__':
   b = B()
   print(len(b))
   #在這里等價于
   #print(b.__len__())

輸出

10

我們在調用len方法的時候會調用__len__。

__setitem__

__setitem__(self,key,value):該方法應該按一定的方式存儲和key相關的value。在設置類實例屬性時自動調用的。

class B():

class B():
  def __init__(self):
    self.a_list = range(10)
  def __setitem__(self, key, value):
    self.__dict__[key] = value
def cfun(a, b, c):
  print("新加入函數c")
if __name__ == '__main__':
  b = B()
  b['a_list'] = "123" # 這個會調用B類的\__setitem_方法_
  B.__setitem__ = cfun # 改變settime方式變?yōu)閏fun這個函數
  b['a_list'] = "123" # 這次實際會調用cfun函數
  print(b.a_list)

輸出

新加入函數c
123

__delitem__

執(zhí)行del函數的時候會調用,如果繼承了 繼承abc.MutableSequence的類就必須實現 __delitem__ 方法,這是 MutableSequence 類的一個抽象方法。

__eq__

a == b等同于a.__eq__(b)。你可以在自己的類中定義 __eq__ 方法,決定 == 如何比較實例。如果不覆蓋 __eq__ 方法,那么從 object 繼承的方法比較

Python主要用來做什么

Python主要應用于:1、Web開發(fā);2、數據科學研究;3、網絡爬蟲;4、嵌入式應用開發(fā);5、游戲開發(fā);6、桌面應用開發(fā)。

上述內容就是如何在python中使用魔法函數,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯成都網站設計公司行業(yè)資訊頻道。

另外有需要云服務器可以了解下創(chuàng)新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

新聞名稱:如何在python中使用魔法函數-創(chuàng)新互聯
文章網址:http://muchs.cn/article42/ddpjhc.html

成都網站建設公司_創(chuàng)新互聯,為您提供Google、外貿網站建設、網站策劃、App設計、定制網站、面包屑導航

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都網站建設公司