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語言如何保密源代碼以防止逆向工程?