最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 魔法函數(shù)實(shí)例及解析

 更新時(shí)間:2019年09月25日 09:33:30   作者:python學(xué)習(xí)開(kāi)發(fā)  
這篇文章主要介紹了python 魔法函數(shù)實(shí)例及解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

python的幾個(gè)魔法函數(shù)

__repr__

Python中這個(gè)__repr__函數(shù),對(duì)應(yīng)repr(object)這個(gè)函數(shù),返回一個(gè)可以用來(lái)表示對(duì)象的可打印字符串.如果我們直接打印一個(gè)類(lèi),向下面這樣

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

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

輸出結(jié)果

<__main__.A object at 0x0000018DF8E7EAC8>

不是很友好,返回了一個(gè)對(duì)象的內(nèi)存地址。我們改成下面再次輸出

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

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

輸出結(jié)果

進(jìn)入函數(shù)

__str__

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

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

輸出結(jié)果

進(jìn)入函數(shù)

比較repr和str

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

__getitem__

如果在類(lèi)中定義了getitem__()方法,那么他的實(shí)例對(duì)象(假設(shè)為A)就可以這樣A[key]取值。當(dāng)實(shí)例對(duì)象做A[key]運(yùn)算時(shí),就會(huì)調(diào)用類(lèi)中的__getitem()方法。

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

輸出

name
124

實(shí)例對(duì)象的key不管是否存在都會(huì)調(diào)用類(lèi)中的__getitem__()方法。而且返回值就是__getitem__()方法中規(guī)定的return值。也就是說(shuō)如果getitem里的方法寫(xiě)的不好就沒(méi)有了意義了。我們修改下代碼,改變getitem的return的值

class A():
  def __init__(self,name=None,id=1):
    self.id=id
    self.name=name
  def __repr__(self):
    return "進(jìn)入函數(shù)"
  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和一個(gè)異常,改后的getitem做了什么事呢,self.__dict__,是獲取當(dāng)前實(shí)例的所有屬性的字典格式,后面的[item]就是取其對(duì)于的鍵值,這里我傳了個(gè)name,實(shí)際就是取name屬性的值也就是lisa。對(duì)于123因?yàn)椴淮嬖谶@個(gè)屬性所有報(bào)錯(cuò)了。這也是字典內(nèi)部實(shí)現(xiàn)的一部分。

再來(lái)看一個(gè)例子,代碼里已經(jīng)加入了注釋:

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

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(除去兩個(gè)王)

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

  def __getitem__(self, position):
    # 調(diào)用f[0]時(shí)會(huì)進(jìn)入
    return self._cards[position]
if __name__ == '__main__':
  f = FrenchDeck()

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

輸出

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

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

__len__

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

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))
   #在這里等價(jià)于
   #print(b.__len__())

輸出

10

我們?cè)谡{(diào)用len方法的時(shí)候會(huì)調(diào)用__len__。

__setitem__

__setitem__(self,key,value):該方法應(yīng)該按一定的方式存儲(chǔ)和key相關(guān)的value。在設(shè)置類(lèi)實(shí)例屬性時(shí)自動(dòng)調(diào)用的。

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("新加入函數(shù)c")
if __name__ == '__main__':
  b = B()
  b['a_list'] = "123" # 這個(gè)會(huì)調(diào)用B類(lèi)的\__setitem_方法_
  B.__setitem__ = cfun # 改變settime方式變?yōu)閏fun這個(gè)函數(shù)
  b['a_list'] = "123" # 這次實(shí)際會(huì)調(diào)用cfun函數(shù)
  print(b.a_list)

輸出

新加入函數(shù)c
123

__delitem__

執(zhí)行del函數(shù)的時(shí)候會(huì)調(diào)用,如果繼承了 繼承abc.MutableSequence的類(lèi)就必須實(shí)現(xiàn) __delitem__ 方法,這是 MutableSequence 類(lèi)的一個(gè)抽象方法。

__eq__

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python登錄WeChat 實(shí)現(xiàn)自動(dòng)回復(fù)實(shí)例詳解

    python登錄WeChat 實(shí)現(xiàn)自動(dòng)回復(fù)實(shí)例詳解

    在本篇內(nèi)容里小編給大家整理的是關(guān)于python登錄WeChat 實(shí)現(xiàn)自動(dòng)回復(fù)的相關(guān)實(shí)例內(nèi)容以及知識(shí)點(diǎn)總結(jié),有興趣的朋友們參考下。
    2019-05-05
  • 一文詳解如何使用Python批量拼接圖片

    一文詳解如何使用Python批量拼接圖片

    這篇文章主要給大家介紹了關(guān)于如何使用Python批量拼接圖片的相關(guān)資料,文中主要用的是PIL庫(kù),PIL庫(kù)是一個(gè)具有強(qiáng)大圖像處理能力的第三方庫(kù),不僅包含了豐富的像素、色彩操作功能,還可以用于圖像歸檔和批量處理,需要的朋友可以參考下
    2023-05-05
  • Python實(shí)現(xiàn)網(wǎng)站注冊(cè)驗(yàn)證碼生成類(lèi)

    Python實(shí)現(xiàn)網(wǎng)站注冊(cè)驗(yàn)證碼生成類(lèi)

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)網(wǎng)站注冊(cè)驗(yàn)證碼生成類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Django完整增刪改查系統(tǒng)實(shí)例代碼

    Django完整增刪改查系統(tǒng)實(shí)例代碼

    Django實(shí)現(xiàn)增刪改查,主要是依賴(lài)于models來(lái)實(shí)現(xiàn)的,下面這篇文章主要給大家介紹了關(guān)于Django完整增刪改查系統(tǒng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • python實(shí)現(xiàn)猜單詞游戲

    python實(shí)現(xiàn)猜單詞游戲

    這篇文章主要為大家詳細(xì)介紹了python猜單詞小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • python向量化與for循環(huán)耗時(shí)對(duì)比分析

    python向量化與for循環(huán)耗時(shí)對(duì)比分析

    這篇文章主要介紹了python向量化與for循環(huán)耗時(shí)對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python深度學(xué)習(xí)之使用Albumentations對(duì)圖像做增強(qiáng)

    Python深度學(xué)習(xí)之使用Albumentations對(duì)圖像做增強(qiáng)

    諸如RandomCrop和CenterCrop之類(lèi)的某些增強(qiáng)功能可能會(huì)變換圖像,使其不包含所有原始邊界框. 本示例說(shuō)明如何使用名為RandomSizedBBoxSafeCrop的變換來(lái)裁剪圖像的一部分,但保留原始圖像的所有邊界框,需要的朋友可以參考下
    2021-05-05
  • Python機(jī)器學(xué)習(xí)應(yīng)用之基于線性判別模型的分類(lèi)篇詳解

    Python機(jī)器學(xué)習(xí)應(yīng)用之基于線性判別模型的分類(lèi)篇詳解

    線性判別分析(Linear?Discriminant?Analysis,?LDA)是一種監(jiān)督學(xué)習(xí)的降維方法,也就是說(shuō)數(shù)據(jù)集的每個(gè)樣本是有類(lèi)別輸出。和之前介紹的機(jī)器學(xué)習(xí)降維之主成分分析(PCA)方法不同,PCA是不考慮樣本類(lèi)別輸出的無(wú)監(jiān)督學(xué)習(xí)方法
    2022-01-01
  • 解決mnist數(shù)據(jù)集下載的相關(guān)問(wèn)題

    解決mnist數(shù)據(jù)集下載的相關(guān)問(wèn)題

    這篇文章主要介紹了解決mnist數(shù)據(jù)集下載的相關(guān)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python使用Tkinter實(shí)現(xiàn)機(jī)器人走迷宮

    Python使用Tkinter實(shí)現(xiàn)機(jī)器人走迷宮

    這篇文章主要為大家詳細(xì)介紹了Python使用Tkinter實(shí)現(xiàn)機(jī)器人走迷宮,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論

夹江县| 革吉县| 河曲县| 梁河县| 闽侯县| 石渠县| 黔江区| 湟中县| 天祝| 卢湾区| 永修县| 武宁县| 虎林市| 闸北区| 积石山| 弥勒县| 区。| 屏东县| 阜平县| 无极县| 洪洞县| 新沂市| 景宁| 库尔勒市| 永泰县| 曲麻莱县| 石景山区| 藁城市| 汝南县| 左云县| 府谷县| 安化县| 岱山县| 富平县| 宜都市| 黎城县| 株洲县| 金山区| 随州市| 尼木县| 武穴市|