python buildin 中的一些類中為什麼方法的內容都是pass?

本人接觸python的時間不長,最近在看一些python源碼的時候發現很多內嵌類中方法的實現都是pass,一直往上追蹤到object,也沒有發現實現的地方。平時在使用的時候,比如a = dict() ,直接就可以使用a.get()之類的方法了,說明dict也不是類似java中介面的東西,那麼這些類方法的具體實現究竟在哪裡呢?求大神指教!


這個問題是這樣的,當你用pycharm 查看定義時,

PyCharm在騙你,您正在查看的源代碼是PyCharm創建的偽造品。 PyCharm知道哪些函數或object 應該在那裡,它可以使用函數docstrings來猜測它們的簽名,但是它不知道函數體應該是什麼樣的。

python (特值cpython)是用c 語言寫的。

如果您想查看真實的源代碼,可以在

https://github.com/python/cpython/blob/master/Objects/dictobject.c

中看到dict 是怎麼實現的。


你看到的這些並不是python源碼,而是IDE為了方便提示加的假代碼


這個是為了IDE友好的,IDE中自行創建這些類是為了能較好的代碼提示。而這些基礎類型有的實現是C實現的。所以作為IDE,就用pass來代替其內容了。

而大多數的標準庫是python本身實現的,如os,threading。這些代碼追蹤就能看到源碼了。


著作權歸作者所有。

商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

作者:DreamLRH

鏈接:python中類的全面分析 - CSDN博客

來源:CSDN博客

在Python中,定義類是通過class關鍵字,class後面緊接著是類名,即Student,類名通常是大寫開頭的單詞,緊接著是(object),表示該類是從哪個類繼承下來的。通常,如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承的類。

面向對象重要的概念就是類(Class)和實例(Instance),類是抽象的模板,而實例是根據類創建出來的一個個具體的「對象」,每個對象都擁有相同的方法,但各自的數據可能不同。

先回顧下 OOP 的常用術語:

類:對具有相同數據和方法的一組對象的描述或定義。

對象:對象是一個類的實例。

實例(instance):一個對象的實例化實現。

實例屬性(instance attribute):一個對象就是一組屬性的集合。

實例方法(instance method):所有存取或者更新對象某個實例一條或者多條屬性的函數的集合。

類屬性(classattribute):屬於一個類中所有對象的屬性,不會只在某個實例上發生變化

類方法(classmethod):那些無須特定的對象實例就能夠工作的從屬於類的函數。

類概述

在Python中,定義類是通過class關鍵字:

class Student(object):

pass

class後面緊接著是類名,即Student,類名通常是大寫開頭的單詞,緊接著是(object),表示該類是從哪個類繼承下來的。通常,如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承的類。

定義好了Student類,就可以根據Student類創建出Student的實例,創建實例是通過類名+()實現的:

&>&>&> bart = Student()

&>&>&> bart

&<__main__.Student object at 0x10a67a590&>

&>&>&> Student

&

可以看到,變數bart指向的就是一個Student的object,後面的0x10a67a590是內存地址,每個object的地址都不一樣,而Student本身則是一個類。

可以自由地給一個實例變數綁定屬性,比如,給實例bart綁定一個name屬性:

&>&>&> bart.name = "Bart Simpson"

&>&>&> bart.name

"Bart Simpson"

由於類可以起到模板的作用,因此,可以在創建實例的時候,把一些我們認為必須綁定的屬性強制填寫進去。通過定義一個特殊的init方法,在創建實例的時候,就把name,score等屬性綁上去。

class Student(object):

def __init__(self, name, score):

self.name = name

self.score = score

注意到init方法的第一個參數永遠是self,表示創建的實例本身,因此,在init方法內部,就可以把各種屬性綁定到self,因為self就指向創建的實例本身。

有了init方法,在創建實例的時候,就不能傳入空的參數了,必須傳入與init方法匹配的參數,但self不需要傳,Python解釋器自己會把實例變數傳進去:

&>&>&> bart = Student("Bart Simpson", 59)

&>&>&> bart.name

"Bart Simpson"

&>&>&> bart.score

59

和普通的函數相比,在類中定義的對象函數(還有靜態方法,類方法)只有一點不同,就是第一個參數永遠是實例變數self,並且,調用時不用傳遞該參數。

新式類、舊式類

python的新式類是2.2版本引進來的,之前的類叫做經典類或者舊類。Python 2.x 中如果一個類繼承於一個基類(可以是自定義類或者其它類)或者繼承自 object,則該類為新式類;沒有繼承的類為經典類。Python 3.x 則全部為新式類。

新式類被賦予了很多新的特性(如:統一了types和classes),並改變了以往經典類的一些內容(如:改變了多繼承下方法的執行順序)。

關於統一類(class)和類型(type),具體看下面的例子

class OldClass():

pass

o = OldClass()

print o.__class__ # __main__.OldClass

print type(o) # &

class newClass(object):

pass

n = newClass()

print n.__class__ # &

print type(n) # &

對象屬性

Python 中對象的屬性包含對象的所有內容:方法和數據,注意方法也是對象的屬性。查找對象的屬性時,首先在對象的__dict__ 裡面查找,然後是對象所屬類的dict,再往後是繼承體系中父類(MRO解析)的dict,任意一個地方查找到就終止查找,並且調用 __getattribute__(也有可能是__getattr__) 方法獲得屬性值。

方法

在 Python 類中有3種方法,即靜態方法(staticmethod),類方法(classmethod)和實例方法:

對於實例方法,在類里每次定義實例方法的時候都需要指定實例(該方法的第一個參數,名字約定成俗為self)。這是因為實例方法的調用離不開實例,我們必須給函數傳遞一個實例。假設對象a具有實例方法 foo(self, *args, **kwargs),那麼調用的時候可以用 a.foo(*args, **kwargs),或者 A.foo(a, *args, **kwargs),在解釋器看來它們是完全一樣的。

類方法每次定義的時候需要指定類(該方法的第一個參數,名字約定成俗為cls),調用時和實例方法類似需要指定一個類。

靜態方法其實和普通的方法一樣,只不過在調用的時候需要使用類或者實例。之所以需要靜態方法,是因為有時候需要將一組邏輯上相關的函數放在一個類裡面,便於組織代碼結構。一般如果一個方法不需要用到self,那麼它就適合用作靜態方法。


推薦閱讀:

Python多重繼承是否始終是遵循從左到右 深度優先的規則?
記事本能知道文本的編碼(ANSI,UTF-8等),但python要open時設置encoding?
為什麼 Python、Ruby 等語言棄用了自增運算符?
如何找到適合需求的 Python 庫?
使用python語言如何保密源代碼以防止逆向工程?

TAG:Python | Python3x | Python入門 | Python開發 |