日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 魔法函数 __add___PythonI/O进阶学习笔记_2.魔法函数

發布時間:2024/10/12 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 魔法函数 __add___PythonI/O进阶学习笔记_2.魔法函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

本文一切觀點和測試代碼是在python3的基礎上。

Content:

1.什么是魔法函數,魔法函數__getitem__在python中應用。

2.python的數據模型和數據模型這種設計對python的影響

3.python常用的魔法函數

4.從len()方法看魔法函數的特點

5.魔法函數知識小結

一? ?python的魔法函數

1.什么是魔法函數?

魔法函數是Python中定義的,以__開頭,__結尾,形如__fun__()的函數,一般使用已經定義好了的即可。

使用這樣一些函數,可以讓我們自定義的類有更加強大的特性。

魔法函數一般是隱式調用的,不需要我們顯示調用。(即python解釋器幫我們調用實現)

2.如何使用魔法函數?

例:我們建立一個公司類,里面有員工列表屬性。需要循環打印所有員工。

普通方法為:

1 classCompany:2 def __init__(self,employee_list):3 self.employee=employee_list4 user_list=['ttr1','ttrr2','ttrr3']5 company=Company(user_list)6 for i incompany.employee:7 print(i)

如果說我們用python一個內置的魔法函數的話:

user_list=['ttr1','ttrr2','ttrr3']

company=Company(user_list)classCompany_Magic:def __init__(self,employee_list):

self.employee_list=employee_listdef __getitem__(self, item):returnself.employee_list[item]

company2=Company_Magic(user_list)for i incompany2:print(i)

區別:第二種直接對對象進行了for循環,第一種對對象里面的一個屬性(list)進行循環。

就是第二種Company_Magic類生成的對象,是有可以迭代這個特性的。

因為__getitem__幫我們實現了一個邏輯,每次我們實現for循環的時候,for會去找company2這個對象中的__getitem__方法(實際上是先找另外一個迭代方法),并且傳入0、1、2...直到拋了異常然后結束。這是解釋器幫我們實現的功能。

ps.想想看如果__getitem__這個函數不管傳入什么item都不報異常會怎么樣?

二? python的數據模型和數據模型這種設計模式賦予python的特性

1.什么是數據模型?

數據模型其實是對 Python 框架的描述,它規范了這門語言自身構建模塊的接口,這些模塊包括但不限于序列、迭代器、函數、類等。

而魔法函數就是數據模型的一個概念。java中常被叫魔術方法,python常叫數據模型。

2.數據模型對python的影響

魔法函數不屬于定義它的那個類,只是增強了類的一些功能。

實現了特定的魔法函數之后,某些操作會變得特別簡單。

我們可以采用實現魔法函數來靈活地設計我們需要的類。

這點是很重要的需要明白python的類有些特性是可以被靈活設計的,只要在編碼中讓它遵循了某種特定的協議(魔法函數)。

三 python常用的魔法函數

__init__:最常用。

__str__:被print函數調用;這個魔法函數必須返回為string,否則拋異常。

(我記得最開始初學python調用mongodb對象的什么方法來著,返回的數據用print出來的字符串一直沒問題,但是做處理的時候一直說數據格式有誤,就是因為傳回來的數據對象做了__str__處理。)

__len__:可以對對象使用 len()函數。在dict、list等類型中也實現了這個方法。

在pycharm中,輸入dict() ,用ctrl+B 跳到dict的定義,可以看到dict具有哪些魔法方法。或者用dir({})也可以看到。

還有很多比較重要的魔法方法例如 __setattr__() 、__getattr__()、__setitem__()、__getitem__()、__iter__() 超多簡化我們編程的魔法函數。

四? 用__len__看魔法函數大致做了哪些事情?

在三中我們看到,dict()的定義中的魔法函數__len__()定義的內容為空,list()也是。

實際上,我們在這里看到的相當于只是一個接口的定義而已,真正的實現是在cpython中。

為了加快len()的速度,比如list、dict、set類型,實際上會走一個捷徑。在cpython中,list、dict、set等內置類型是用c實現的,會在c數據結構內部有個參數用來存儲數據的長度,len()是直接去讀數據結構的長度。所以復雜度是O(1)。

以下為拓展,可不看:

有關 list 定義源碼位置在 Python 目錄下的 include/listobject.h 內, 代碼如下:

typedef struct{

PyObject_VAR_HEAD/*Vector of pointers to list elements. list[0] is ob_item[0], etc.*/PyObject**ob_item;/*ob_item contains space for 'allocated' elements. The number

* currently in use is ob_size.

* Invariants:

* 0 <= ob_size <= allocated

* len(list) == ob_size

* ob_item == NULL implies ob_size == allocated == 0

* list.sort() temporarily sets allocated to -1 to detect mutations.

*

* Items must normally not be NULL, except during construction when

* the list is not yet visible outside the function that builds it.*/Py_ssize_t allocated;

} PyListObject;

其中 ob_item 是指向列表元素的指針數組, list[0] 即 ob_item[0], allocated 是列表的空間大小。在 PyObject_VAR_HEAD 中, 擁有一個 ob_size 變量。

下面是 Python 目錄下的 include/object.h 中的相關代碼:

#define PyObject_VAR_HEAD PyVarObject ob_base;...

...

typedefstruct{

PyObject ob_base;

Py_ssize_t ob_size;/*Number of items in variable part*/} PyVarObject;

ob_size 變量存儲的就是對象的長度, 所以每次調用 _len_() 方法的時候, 返回的是一個已經存儲好了的變量,

小結:魔法函數大部分都做了很多優化的事情,設計理念還是比較重要的。

五? 總結

魔法函數是貫穿所有python知識點的。

可以用魔法函數來組織自己腦子里python知識點的知識樹。

魔法函數是內置的前面為__的方法

魔法函數是不需要顯示調用的,python語法本身會隱含調用魔法函數

魔法函數和對象不存在繼承關系,任何對象都可以定義魔法函數

魔法函數讓python的各種類型組織起來了,讓對象有數據類型,比如增加一個迭代類型等

__str__\__repr__\__add__等等多種常用魔法函數熟知會讓代碼更pythonic

python解釋器其實會經可能提高很多效率,讓開發者靈活性變高

總結

以上是生活随笔為你收集整理的python 魔法函数 __add___PythonI/O进阶学习笔记_2.魔法函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲综合一区二区 | 亚洲高清天堂 | 日韩成人在线免费视频 | 国产黄频在线观看 | 日本欧美视频 | 亚洲国产系列 | 久久爱资源网 | 国产乱子伦精品视频 | 豆花视频在线 | 好吊视频一区二区 | 一本久久久久 | 日韩啊啊啊 | 2021天天操 | 日本成人小视频 | 亚洲男人天堂久久 | 亚洲图区综合 | 黄色一级免费片 | 亚洲欧美另类激情 | 黄色一级片欧美 | 麻豆最新 | 国产精品丝袜黑色高跟鞋 | 国产高清在线观看视频 | 免费无码国产v片在线观看 三级全黄做爰在线观看 | 欧美图片一区二区三区 | 日本天堂在线视频 | 免费色站 | 色宗合 | 日韩一区二区视频在线观看 | 爱看av| 亚洲高清视频网站 | 成人福利免费视频 | 亚洲视频高清 | 国产精品永久在线观看 | 国产精品久久久久久久免费观看 | 久久久精品久久久久久 | 天天爽天天摸 | 深爱激情五月婷婷 | 91在线精品一区二区 | 日韩黄色大全 | 精品国产一区二区三区久久久久久 | 蜜桃在线一区二区三区 | 免费看美女隐私网站 | 艳妇乳肉亭妇荡乳av | 91麻豆精品一二三区在线 | 美女性生活视频 | 欧洲精品一区二区三区 | 无码精品人妻一区二区三区漫画 | 美女av免费 | 久一在线| japansexxxxhd医生| 国产www色| 国产香蕉视频在线 | jizz亚洲女人 | 国产精品亚洲五月天丁香 | 日韩福利网站 | 韩国无码一区二区三区精品 | 国产三级久久久久 | 日韩精品久久久久久久酒店 | 日韩av无码一区二区三区 | 久久国语对白 | 日韩精品人妻一区二区三区免费 | 亚洲av色一区二区三区精品 | 日本大尺度吃奶做爰久久久绯色 | 久一国产| 校园春色中文字幕 | 亚洲av乱码一区二区 | 欧美成人免费看 | 老熟妇仑乱一区二区av | av撸撸在线| 老熟女高潮喷水了 | 亚洲黄色在线观看视频 | 成人免费做受小说 | 涩涩涩综合 | 国产一级免费片 | 国产精品免费视频观看 | 快色视频 | 日本高清精品 | 在线看欧美 | 国产精品中文久久久久久 | 新天堂网| 18禁男女爽爽爽午夜网站免费 | 99久久久久成人国产免费 | 成年人国产精品 | 国产性一乱一性一伧一色 | 无码国产色欲xxxx视频 | 亚洲va在线观看 | 日韩精品黄 | 久久aaaa片一区二区 | 日本亚洲网站 | 干爹你真棒插曲mv在线观看 | 校园春色亚洲 | 久久国产精品免费观看 | 日韩不卡免费视频 | 美女扒开下面让男人捅 | 久久a视频 | 在线看日本 | 三级中文字幕在线 | 一区二区三区福利视频 | 国产麻豆精品在线 |