Python編程之面向對象

面向對象編程——Object Oriented Programming,簡稱OOP,是一種程序設計思想。OOP把對象作爲程序的基本單元,一個對象包含了數據和操作數據的函數

在Python中,所有數據類型都可以視爲對象,當然也可以自定義對象。自定義的對象數據類型就是面向對象中的類(Class)的概念。

給對象發消息實際上就是調用對象對應的關聯函數,我們稱之爲對象的方法(Method)。

面向對象的抽象程度又比函數要高,因爲一個Class既包含數據,又包含操作數據的方法

一、類和實例

class Student(object):
    pass
bart = Student()

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

>>> bart.name = 'Bart Simpson'
>>> bart.name
'Bart Simpson
class Student(object):

    def __init__(self, name, score):  #相當於構造方法,第一個參數永遠是self,表示創建的實例本身
        self.name = name
        self.score = score
二、訪問限制

在Python中,實例的變量名如果以__(兩個)開頭,就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問

class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score

    def print_score(self):
        print '%s: %s' % (self.__name, self.__score)
改完後,對於外部代碼來說,沒什麼變動,但是已經無法從外部訪問實例變量.__name實例變量.__score了:

在Python中,變量名類似__xxx__的,也就是以雙下劃線開頭,並且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接訪問的,不是private變量,所以,不能用__name____score__這樣的變量名。

能直接訪問__name是因爲Python解釋器對外把__name變量改成了_Student__name,所以,仍然可以通過_Student__name來訪問__name變量:

>>> bart._Student__name
'Bart Simpson'
三、繼承與多態

class Animal(object):
    def run(self):
        print 'Animal is running...'
class Dog(Animal):
    def run(self):
        print 'Dog is running...'

class Cat(Animal):
    def run(self):
        print 'Cat is running...
多態當子類和父類都存在相同的run()方法時,我們說,子類的run()覆蓋了父類的run(),在代碼運行的時候,總是會調用子類的run()

繼承關係中,如果一個實例的數據類型是某個子類,那它的數據類型也可以被看做是父類。但是,反過來就不行

>>> b = Animal()
>>> isinstance(b, Dog)
False
四、獲取對象信息

1、使用type()

>>> type(123)
<type 'int'>
>>> type('str')
<type 'str'>
>>> type(None)
<type 'NoneType'>
>>> type(abs)
<type 'builtin_function_or_method'>
>>> type(a)
<class '__main__.Animal'>
>>> import types
>>> type('abc')==types.StringType
True
>>> type(u'abc')==types.UnicodeType
True
>>> type([])==types.ListType
True
>>> type(str)==types.TypeType
True
2、使用isinstance()

isinstance()判斷的是一個對象是否是該類型本身,或者位於該類型的父繼承鏈上

>>> isinstance(h, Animal)
True
能用type()判斷的基本類型也可以用isinstance()判斷:

>>> isinstance('a', str)
True
>>> isinstance(u'a', unicode)
True
>>> isinstance('a', unicode)
False

並且還可以判斷一個變量是否是某些類型中的一種,比如下面的代碼就可以判斷是否是str或者unicode:

>>> isinstance('a', (str, unicode))
True
>>> isinstance(u'a', (str, unicode))
True



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章