面向對象編程——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