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()
?
因為是在類上調用,而非實例上調用,因此類方法無法獲得任何實例變量,只能獲得類的引用。
?
?
?
?
?
?