成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

魔法方法推開Python進階學習大門

開發 后端
Python是Guido van Rossum設計出來的讓使用者覺得如沐春風的一門編程語言。

[[376059]]

本文轉載自微信公眾號「PythonMind」,作者dongfanger。轉載本文請聯系PythonMind公眾號。  

熱愛Python

Python是Guido van Rossum設計出來的讓使用者覺得如沐春風的一門編程語言。2020年11月12日,64歲的Python之父宣布由于退休生活太無聊,自己決定加入Microsoft的DevDiv Team,致力于“確保更好地使用Python”。盡管在國內有些聲音在Diss著Python,認為它太簡單,只是個腳本語言,但是它的發明者對Python的熱情,仍然激勵著我們堅持對Python的熱愛。

龜叔是所有編程語言發明者當中頭發最多的這位。

[[376060]]

 

奇跡時刻

collection.len()是面向對象語言的寫法,len(collection)是Python語言的寫法,這種風格叫做Pythonic。從前者到后者,就像變魔術一樣,一瞬間讓人眼前一亮。這個魔術就是Python魔法方法,或者叫雙下方法,它是用雙下劃線開頭和雙下劃線結尾的特殊方法,比如obj[key],Python解釋器實際上會轉換成obj.__getitem__(key)來運行,但是使用者并無感知。

__getitem__和__len

____getitem__用來獲取數據,__len__用來返回長度,這2個魔法方法是Python基礎,我們通過一副撲克牌來了解:

  1. import collections 
  2.  
  3. # 定義一副牌 
  4. Card = collections.namedtuple('Card', ['rank''suit']) 
  5.  
  6. class FrenchDeck: 
  7.     # 大小 
  8.     ranks = [str(n) for n in range(2, 11)] + list('JQKA'
  9.     # 花色 
  10.     suits = 'spades diamonds clubs hearts'.split() 
  11.  
  12.     def __init__(self): 
  13.         # 生成一副牌 
  14.         self._cards = [Card(rank, suit) for suit in self.suits 
  15.                                         for rank in self.ranks] 
  16.  
  17.     def __len__(self): 
  18.         return len(self._cards) 
  19.  
  20.     def __getitem__(self, position): 
  21.         return self._cards[position] 

本來我們對這副牌什么都不能做,但是由于實現了__len__,可以使用len()函數查看有多少張牌:

  1. >>> len(deck) 
  2. 52 

由于實現了__getitem__,可以使用中括號索引取值:

  1. >>> deck[0] 
  2. Card(rank='2', suit='spades'

能進行切片:

  1. >>> deck[:3] 
  2. [Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')] 
  3. >>> deck[12::13] 
  4. [Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')] 

能迭代:

  1. >>> for card in deck:  # doctest: +ELLIPSIS 
  2. ...   print(card) 
  3. Card(rank='2', suit='spades'
  4. Card(rank='3', suit='spades'
  5. Card(rank='4', suit='spades'
  6. ... 

發現沒有,魔法方法是可以用來裝B的!別人寫個類只能get、set,你寫個類還能花式炫技,666。

Python魔法方法是給Python解釋器使用的,一般不需要直接調用,Python會自己去調,比如把len(my_object)寫成my_object.__len__(),就弄巧成拙了。

魔法方法實現運算符

前面例子實現了取值和長度,接著再看一個例子,使用__repr__、__abs__、__bool__、__add__、__mul__,實現運算符:

  1. from math import hypot 
  2.  
  3. # 二維向量 
  4. class Vector: 
  5.  
  6.     def __init__(self, x=0, y=0): 
  7.         self.x = x 
  8.         self.y = y 
  9.  
  10.     # 表達式 
  11.     def __repr__(self): 
  12.         return 'Vector(%r, %r)' % (self.x, self.y) 
  13.  
  14.     # 絕對值 
  15.     def __abs__(self): 
  16.         return hypot(self.x, self.y) 
  17.  
  18.     # 布爾值 
  19.     def __bool__(self): 
  20.         return bool(abs(self)) 
  21.  
  22.     # 加法 
  23.     def __add__(self, other): 
  24.         x = self.x + other.x 
  25.         y = self.y + other.y 
  26.         return Vector(x, y) 
  27.  
  28.     #乘法 
  29.     def __mul__(self, scalar): 
  30.         return Vector(self.x * scalar, self.y * scalar) 

__add__實現了加法:

  1. >>> v1 = Vector(2, 4) 
  2. >>> v2 = Vector(2, 1) 
  3. >>> v1 + v2 
  4. Vector(4, 5) 

__abs__實現了絕對值:

  1. >>> v = Vector(3, 4) 
  2. >>> abs(v) 
  3. 5.0 

__mul__實現了乘法:

  1. >>> v * 3 
  2. Vector(9, 12) 

__repr__實現了對象的字符串表示:

  1. Vector(4, 5) 

否則得到的字符串可能是

__bool__實現了布爾值:

  1. if Vector(4, 5): 
  2.     return True 

其他魔法方法

 

 


一篇文章是講不完魔法方法的,我們會在后續文章中,繼續探討如何使用和實現它們。

 

 

Tips

本小節內容是我看《流暢的Python》第一遍時記錄的知識點:

  1. collections.namedtuple可以用來創建只有少數屬性但沒有方法的對象,比如
  1. beer_card = Card('7''diamonds'
  1. 2.random.choice和random.sample不一樣的地方在于,sample是返回序列,choice是返回元素,當使用sample(list, 1)[0]的時候,不如直接使用choice(list)。
  2. 特殊方法的存在是為了被Python解釋器調用的。
  3. PyVarObject是表示內存中長度可變的內置對象的C語言結構體。list或str或bytearray的__len__實際上返回的PyVarObject.ob_size屬性,這個比調用一個方法要快的多。
  4. len之所以不是一個普通方法,是為了讓python自帶的數據結構可以走后門,abs也是同理。
  5. 很多時候調用__init__方法的目的是,在你自己的子類的__init__方法中調用超類的構造器。
  6. abs,如果輸入是整數或者浮點數,它返回的是輸入值的絕對值;如果輸入是復數,那么返回這個復數的模。
  7. __repr__和__str__二選一的話,__repr__更好,因為如果一個對象沒有__str__函數,解釋器會用__repr__作為替代。
  8. python對象的一個基本要求就是它得有合理的字符串表示形式,這就是數據模型中存在特殊方法__repr__和__str__的原因。
  9. 為了判定一個值x為真還是為假,python會調用bool(x),它的背后是調用x.__bool__()。如果不存在,就會調用x.__len__(),返回0為Flase,非0為True。
  10. python通過運算符重載這一模式提供了豐富的數值類型,除了內置那些,還有decimal.Decimal和fractions.Fraction。

 

責任編輯:武曉燕 來源: PythonMind
相關推薦

2022-12-19 15:12:34

python運算符

2022-07-07 08:01:51

Python魔法方法代碼

2017-04-18 10:59:28

軟件測試認證

2020-04-03 16:52:01

基建數字發展

2024-08-19 10:21:37

接口Python魔法方法

2022-05-10 09:19:29

異網漫游5G網絡

2023-07-04 08:33:46

Python對象編程

2022-08-08 15:48:17

研究模型

2024-10-29 10:54:07

2022-11-04 17:02:31

AI模型

2010-02-05 11:23:01

C++聲明語法

2016-03-31 14:07:51

大數據數據可視化

2015-04-16 13:38:26

GPU計算深度學習NVIDIA

2024-12-04 13:00:00

2013-04-16 09:30:08

OpenStack開源云

2010-07-23 14:34:38

2020-01-19 11:57:44

Python 開發編程語言

2020-09-18 06:48:21

Python編程語言

2021-11-29 07:02:24

Python函數操作

2013-11-01 15:01:02

微軟Azure開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩中文欧美 | 欧美视频一区二区三区 | 午夜专区| 97色在线视频 | 国产一级免费视频 | 久久精品国产精品青草 | 国产欧美精品一区二区三区 | 中文字幕在线观看日韩 | 亚洲欧美日韩一区二区 | 99中文字幕 | 四虎最新地址 | 91xxx在线观看 | 亚洲国产精品视频 | 久久国产精品一区二区 | 欧美日韩精品一区二区三区视频 | 午夜tv免费观看 | 综合国产在线 | 婷婷色网| 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 国产精品一区二区av | 久久久精品视频免费看 | 手机在线观看 | 亚洲精品一区二区冲田杏梨 | 一级黄色影片在线观看 | 久久精品欧美一区二区三区不卡 | 欧美一级大黄 | 亚洲精品免费在线观看 | 丁香久久| 天天干.com | 黄a大片 | 日韩色视频 | 97高清国语自产拍 | 日韩欧美中文字幕在线观看 | 91久久夜色 | 两性午夜视频 | 91久久精品国产91久久性色tv | 天堂成人国产精品一区 | 国产久视频 | 亚洲黄色片免费观看 | 夜夜夜夜夜夜曰天天天 | www.黄色片视频 |