轉自 http://www.cnblogs.com/BeginMan/p/3510786.htmlhtml
# 建立類 class ClassName(object): """docstring for ClassName""" def __init__(self, arg): super(ClassName, self).__init__() self.arg = arg # 建立實例 instance = ClassName()
方法是類的功能
定義在類中
經過實例調用java
每一個類方法都有一個self
參數,表明實例對象自己,當實例調用方法時,由解釋器悄悄地傳遞給方法,不用手動self進來。
self在Python裏不是關鍵字。self表明當前對象的地址。self能避免非限定調用形成的全局變量。
在wangkangluo1的Python爲何要self中講的很清楚:python
建立了一個類MyClass,實例化MyClass獲得了MyObject這個對象,而後調用這個對象的方法MyObject.method(arg1,arg2) ,這個過程當中,Python會自動轉爲Myclass.mehod(MyObject,arg1,arg2)
這就是Python的self的原理了。即便你的類的方法不須要任何參數,但仍是得給這個方法定義一個self參數。shell
定義完類以後就產生了類對象,類對象支持的兩種操做:引用和實例
。引用:經過類對象去調用類中的屬性或方法;實例:經過類對象實例化一個類對象的實體。編程
屬性就是另外一個對象的數據或函數元素!經過句點符號訪問,如一些python類型如複數有數據屬性,列表和字典擁有方法(函數屬性)。還有多是,訪問一個屬性時,這個屬性又是對象,其又擁有本身的屬性,這樣就構成了屬性鏈。如:ssh
>>> import sys >>> sys.stdout.write('beginman') beginman >>> myMoudel.myClass.__doc__
類屬性與類相關,與實例無關,一般是類的數據屬性,僅僅是類中定義的變量,一般稱做靜態變量或靜態數據。在其餘語言中至關於在變量前加上
static
。函數
>>> class C(object): foo = 100 # 定義類屬性 >>> print C.foo # 訪問類屬性 100 >>> C.foo = C.foo+100 # 更新類屬性 >>> C.foo 200
由上所知,類屬性僅僅與類(類也是對象,python中稱類對象)相關,與實例半毛錢關係都沒有。oop
>>> class C(object): foo = 100 # 定義類屬性 >>> print C.foo # 訪問類屬性 100 >>> C.foo = C.foo+100 # 更新類屬性 >>> C.foo 200 >>> c=C() # 實例化一個對象c >>> c.foo 200 >>> c.foo = 1000 # 實例試圖修改類屬性 >>> c.foo # 實例想看是否修改爲功,因而就c.foo竟輸出1000,因而實例就滿覺得本身成功了 1000 >>> C.foo # 類對象鄙夷的看了實例同樣,說:「你就是老子生出來的,老子的東西你也能碰??」 200 >>> del c.foo # 實例看完以後當場傻眼,心想mlgb,你牛B,我仍是除掉本身負擔沉重的改造吧 >>> c.foo # 實例除掉了本身負擔沉重的改造後,老老實實地調用類對象給的sb玩意 200 >>> # 經過類對象與實例關於類屬性爭權大戰後,咱們知道了一點: >>> #類屬性僅僅與類(類也是對象,python中稱類對象)相關,與實例半毛錢關係都沒有。 >>> #若是類的實例沒有同名變量也可使用實例來訪問。若是實例含有與類屬性同名的屬性,則用該實例訪問屬性時,訪問的是實例中的屬性。若是類的實例沒有同名變量也可使用實例來訪問。若是實例含有與類屬性同名的屬性,則用該實例訪問屬性時,訪問的是實例中的屬性。 >>>
>>> class C(object): foo = 100 def met(self): print 'i am method for class.' >>> C.met() # C心想方法也是個人一部分,那麼方法也是類屬性*(這點很正確),因而我調用你玩玩 Traceback (most recent call last): File "<pyshell#31>", line 1, in <module> C.met() # C心想方法也是個人一部分,那麼方法也是類屬性*(這點很正確),因而我調用你玩玩 TypeError: unbound method met() must be called with C instance as first argument (got nothing instead) >>> # 出大事了,方法居然不一樣意還反抗了 >>> # 心想這是爲何呢?忽然想到了原來是那鳥人Python >>> # 鳥人 Guido van Rossum 創造Python類給出的規定就是,你能夠創類方法,可是不能調戲她。 >>> c=C() # 類心有不甘,因而創了實例小c來助紂爲虐 >>> c.met() # 實例小c心想,mlgbd,上次想修改類屬性就被你狠狠地鄙視了一番,如今又爲難我,唉,命苦。不管如何試試吧 i am method for class. >>> # 齷齪,類方法居然聽我實例的,因而實例就趕忙找Guido van Rossum問什麼狀況 >>> # Guido van Rossum就說」爲了與OOP慣例保持一致,沒有實例就不能調用方法,這種限制就是Python所描述的綁定概念,方法必須綁定在實例中才聽話,不能把權利都交給了類,這是老子對你實例的恩惠啊。「 >>> # 實例聽完淚牛滿面,類對象發怒了,說:」今天,我就要把我身上的全部零件(屬性)都掏出來看看,看都有誰不聽話!「 >>> dir(C) # 因而類對象使用第一招 dir()內建 ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'foo', 'met'] >>> print C.__dict__ # 第二招就是召遣他最聽話的屬性 __dict__ 來揪出 {'__module__': '__main__', 'met': <function met at 0x0000000002D33EB8>, '__dict__': <attribute '__dict__' of 'C' objects>, 'foo': 100, '__weakref__': <attribute '__weakref__' of 'C' objects>, '__doc__': None} >>>
實例的建立:
C++等編程應用,實例對象是New
出來的,Python牛b,就跟人家不同,偏以函數調用的形式實例化。post
class CC(object): #我是Python類默許的,沒重寫__init__,因此也沒有什麼特殊操做 pass class C(object): def __init__(self,name,phone,ID): super(C,self).__init__() self.name = name self.phone = phone self.id = ID print 'Hi man 我重寫了__init__,由於我須要更多的操做' cc = CC() # 建立CC實例 c = C('BeginMan','110','12306') # 建立C實例
重點::
當類被調用,實例化的第一步就是建立實例對象,而後Python檢查是否實現了__init__()
方法,默認狀況下若是沒有覆蓋__init__
就不會施加特別的操做。任何特別的操做都須要重寫__init__
。
接着就是傳遞參數,這依賴於你本身定義的__init__
,它裏面有多少個參數,在實例化的過程當中就要傳多少個參數,不論是否覆蓋了__init__()
,實例對象都要做爲第一個參數傳遞進去。ui
__init__
與__new__
,__call__
的區別:
__new__
更像真正的構造器,建立對象時調用,返回當前對象的一個實例。可是實際中用的不多。
__init__
:初始化工做,建立對象時調用,對當前對象的實例進行初始化,無返回值。在Python中很經常使用的。
__call__
:讓類的實例的行爲表現的像函數同樣,你能夠調用他們,將一個函數當作一個參數傳到另一個函數中等等。不多用。
優先級:__new__
先與__init__
__del__
析構器方法,見《py 核心》
可在建立實例後的任意時間建立,也能夠在"運行時"建立.__init__()
是建立這些屬性的關鍵點。
>>> c.__dict__ # 此時實例c還沒屬性 {} >>> c.__class__ # 實例化的類 <class '__main__.C'> >>> c.foo=1 >>> c.name='CS' >>> c.__dict__ {'foo': 1, 'name': 'CS'} >>> dir(c) [***'foo', 'name'***,'__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
大同小異
Differences between 「Java OOP」 and 「Pythonic OOP」?
真tm的拗口,誰英文好能翻譯下。
__init__
表示什麼? 有什麼意義?這在軟件工程常常見到的,因爲Python OOP實際運用的並非太多,因此對於OOP特徵的體現就不那麼明顯,C++/Java/C# OOP思想體現卻是挺深的,不過本人太菜,難以熟諳OOP的精髓。
面向對象程序設計中的經常使用術語總結
其中對還包括自省。