對Python中的類作簡要的分析

在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 <class '__main__.Student'>  
能夠看到,變量bart指向的就是一個Student的object,後面的0x10a67a590是內存地址,每一個object的地址都不同,而Student自己則是一個類。能夠自由地給一個實例變量綁定屬性,好比,給實例bart綁定一個name屬性:
>>> bart.name = 'Bart Simpson' 
>>> bart.name
 'Bart Simpson'  
因爲類能夠起到模板的做用,所以,能夠在建立實例的時候,把一些咱們認爲必須綁定的屬性強制填寫進去。經過定義一個特殊的init方法,在建立實例的時候,就把name,score等屬性綁上去。python


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)       # <type 'instance'>
class newClass(object):     
pass n = newClass() 
print n.__class__   # <class '__main__.newClass'> 
print type(n)       # <class '__main__.newClass'>  
對象屬性
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,那麼它就適合用做靜態方法。
 函數

相關文章
相關標籤/搜索