<轉>Python OOP(1):從基礎開始

轉自  http://www.cnblogs.com/BeginMan/p/3510786.htmlhtml

本文旨在Python複習和總結:

一、如何建立類和實例?

# 建立類
class ClassName(object):
    """docstring for ClassName"""
    def __init__(self, arg):
        super(ClassName, self).__init__()
        self.arg = arg
# 建立實例
instance = ClassName()

二、經典類與新式類的區別?

三、什麼是方法?如何定義?如何使用?

方法是類的功能
定義在類中
經過實例調用java

四、self表明什麼?用在哪些地方?

每一個類方法都有一個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類屬性和實例屬性?

屬性就是另外一個對象的數據或函數元素!經過句點符號訪問,如一些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__']

python面向對象與其餘語言的異同點?

大同小異
Differences between 「Java OOP」 and 「Pythonic OOP」?
真tm的拗口,誰英文好能翻譯下。

什麼是構造器,__init__表示什麼? 有什麼意義?

參考面向對象的編程init方法

OOP經常使用術語

這在軟件工程常常見到的,因爲Python OOP實際運用的並非太多,因此對於OOP特徵的體現就不那麼明顯,C++/Java/C# OOP思想體現卻是挺深的,不過本人太菜,難以熟諳OOP的精髓。
面向對象程序設計中的經常使用術語總結
其中對還包括自省

什麼是Python自省(反射)?

推薦閱讀

下期:Python OOP高級。

相關文章
相關標籤/搜索