1 介紹
面向對象編程是一種程序設計範式
把程序看做不同對象的相互調用,對現實世界建立對象模型。
面向對象編程的基本思想:
類和實例:
類用於定義抽象類型
實例根據類的定義被創建出來
2 定義類並創建實例
類通過class關鍵字定義,類名以大寫字母開頭,緊接着是(object),表示該類是從哪個類繼承下來的。
class Person(object):
pass
xiaoming = Person() #創建實例
xiaohong = Person()
3 創建實例屬性
對每一個實例,都可以直接給他們的屬性賦值。
例如,給xiaoming這個實例加上name,gender和birth屬性:
xiaoming = Person()
xiaoming.name = 'XiaoMing'
xiaoming.gender = 'Male'
xiaoming.birth = '1990-1-1'
給xiaohong加上的屬性不一定要和xiaoming相同:
xiaohong = Person()
xiaohong.name = 'Xiao Hong'
xiaohong.school = 'No.1 High School'
xiaohong.grade = 2
實例屬性可以像變量一樣進行操作:
xiaohong.grade = xiaohong.grade + 1
4 初始化實例屬性
Person類在創建的時候就擁有name、gender、birth屬性。
在定義Person類時,可以爲Person類添加一個特殊的__init__()方法,當創建實例時,這個方法被自動調用。
__init__()方法的第一個參數必須是self(也可以是別的名字,但建議使用習慣用法)。
class Person(object):
def __init__(self, name, gender, birth):
self.name = name
self.gender = gender
self.birth = birth
xiaoming=Person('Xiao Ming', 'Male', '1991-1-1')
xiaohong=Person('Xiao Hong', 'Female', '1992-2-2')
5 訪問限制
Python對屬性權限的控制是通過屬性名來實現的。
如果一個屬性由雙下劃線開頭(__),該屬性就無法被外部訪問。
class Person(object):
def __init__(self, name):
self.name = name
self._title = 'Mr'
self.__job = 'Student'
>>> p = Person('Bob')
>>> print p.name #ok
>>> print p._title #ok
>>> print p.__job #error
如果一個屬性以"__xxx__"的形式定義,那它又可以被外部訪問了,以"__xxx__"定義的屬性在Python的類中被稱爲特殊屬性。
由很多預定義的特殊屬性可以使用,通常不把普通屬性用以"__xxx__"定義。
6 創建類屬性
相當於java類的靜態變量。
class Person(object):
address = 'Earth' #類屬性
def __init__(self, name)
self.name = name
可以直接訪問類屬性,而不必通過類的實例訪問。
>>> print Person.address #Earth
類屬性也可以動態添加和修改:
Person.address = 'China'
在實例上修改類屬性時,實際上並沒有修改類屬性,而是給實例綁定了一個實例屬性。
當實例屬性和類屬性重名時,實例屬性優先級高,它將屏蔽掉對類屬性的訪問。
所以千萬不要在實例上修改類屬性。
7 定義實例方法
一個實例的私有屬性就是以__開頭的屬性,無法被外部訪問。
實例的方法就是在類中定義的函數,它的第一個參數永遠是self,指向調用該方法的實例本身,其他參數和一個普通函數完全一樣。
class Person(object):
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
在class中定義的實例方法其實也是屬性,它實際上是一個函數對象。
8 定義類方法
相當於java的靜態方法
和屬性類似,方法也分實例方法和類方法
通過@classmethod可以將方法綁定到類上,類方法的第一個參數將傳入類本身,通常將參數命名爲cls。
class Person(object):
count = 0
@classmethod
def how_many(cls):
return cls.count
def __inti__(self, name):
self.name = name
Person.count = Person.count + 1
>>> print Person.how_many()
>>> p1 = Person('Bob')
>>> print Person.how_many()
因爲是在類上調用,而非實例上調用,因此類方法無法獲得任何實例變量,只能獲得類的引用。