08 面向對象編程

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()

 

因爲是在類上調用,而非實例上調用,因此類方法無法獲得任何實例變量,只能獲得類的引用。

 

 

 

 

 

 

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