python知識 物件導向程式設計

2021-07-09 03:41:28 字數 4584 閱讀 4645

class person:

def __init__(self,name):

self.name=name

p1=person('xiao ming')

p2=person('wang wu')

在python中,類通過class關鍵字定義。以person為例,定義乙個person類如下:

class person(object):

pass

按照python的程式設計習慣,類名以大寫字母開頭,緊接著是(object),表示該類是從哪個類繼承下來的。

建立例項屬性

例如,給xiaohong這個例項加上name、school和grade屬性:

xiaohong = person()

xiaohong.name = 'xiao hong'

xiaohong.school = 'no. 1 high school'

xiaohong.grade = 2

例項的屬性可以像普通變數一樣進行操作:

xiaohong.grade = xiaohong.grade + 1

初始化例項屬性

在定義 person 類時,可以為person類新增乙個特殊的__init__()方法,當建立例項時,__init__()方法被自動呼叫,我們就能在此為每個例項都統一加上以下屬性:

class person(object):

def __init__(self, name, gender, birth):

self.name = name

self.gender = gender

self.birth = birth

__init__()方法的第乙個引數必須是self(也可以用別的名字,但建議使用習慣用法),後續引數則可以自由指定,和定義函式沒有任何區別

相應地,建立例項時,就必須要提供除self以外的引數:

xiaoming = person('xiao ming', 'male', '1991-1-1')

xiaohong = person('xiao hong', 'female', '1992-2-2')

訪問限制

python對屬性許可權的控制是通過屬性名來實現的,如果乙個屬性由雙下劃線開頭(__),該屬性就無法被外部訪問。看例子:

class person(object):

def __init__(self, name):

self.name = name

self._title = 'mr'

self.__job = 'student'

p = person('bob')

如果乙個屬性以"__***__"的形式定義,那它又可以被外部訪問了,以"__***__"定義的屬性在python的類中被稱為特殊屬性,有很多預定義的特殊屬性可以使用,通常我們不要把普通屬性用"__***__"定義。

以單下劃線開頭的屬性"_***"雖然也可以被外部訪問,但是,按照習慣,他們不應該被外部訪問。

建立類屬性

class person(object):

address = 'earth'

def __init__(self, name):

self.name = name

因為類屬性是直接繫結在類上的,所以,訪問類屬性不需要建立例項,就可以直接訪問:

print person.address

對乙個例項呼叫類的屬性也是可以訪問的,所有例項都可以訪問到它所屬的類的屬性:

p1 = person('bob')

p2 = person('alice')

由於python是動態語言,類屬性也是可以動態新增和修改的:

person.address = 'china'

print p1.address

類屬性和例項屬性名字衝突怎麼辦

修改類屬性會導致所有例項訪問到的類屬性全部都受影響,但是,如果在例項變數上修改類屬性會發生什麼問題呢?

class person(object):

address = 'earth'

def __init__(self, name):

self.name = name

p1 = person('bob')

p2 = person('alice')

print 'person.address = ' + person.address

p1.address = 'china'

print 'p1.address = ' + p1.address

print 'person.address = ' + person.address

print 'p2.address = ' + p2.address

結果為:

person.address = earth

p1.address = china

person.address = earth

p2.address = earth

原因是p1.address = 'china'並沒有改變 person 的 address,而是給p1這個例項繫結了例項屬性address,對p1來說,它有乙個例項屬性address(值是'china'),而它所屬的類person也有乙個類屬性address,所以:

訪問 p1.address,優先查詢例項屬性,返回'china'。

訪問 p2.address,p2沒有例項屬性address,但是有類屬性address,因此返回'earth'。

可見,當例項屬性和類屬性重名時,例項屬性優先順序高,它將遮蔽掉對類屬性的訪問。

當我們把 p1 的 address 例項屬性刪除後,訪問 p1.address 就又返回類屬性的值 'earth'了:

del p1.address

print p1.address

定義例項方法

例項的方法就是在類中定義的函式,它的第乙個引數永遠是 self,指向呼叫該方法的例項本身,其他引數和乙個普通函式是完全一樣的:

class person(object):

def __init__(self, name):

self.__name = name

def get_name(self):

return self.__name

p1 = person('bob')

print p1.get_name()  # self不需要顯式傳入

# => bob

方法也是屬性

因為方法也是乙個屬性,所以,它也可以動態地新增到例項上,只是需要用 types.methodtype() 把乙個函式變為乙個方法:

import types

def fn_get_grade(self):

if self.score >= 80:

return 'a'

if self.score >= 60:

return 'b'

return 'c'

class person(object):

def __init__(self, name, score):

self.name = name

self.score = score

p1 = person('bob', 90)

p1.get_grade = types.methodtype(fn_get_grade, p1, person)

print p1.get_grade()

定義類方法

和屬性類似,方法也分例項方法和類方法。

class中定義的全部是例項方法,例項方法第乙個引數self是例項本身。

要在class中定義類方法,需要這麼寫:

class person(object):

count = 0

@classmethod

def how_many(cls):

return cls.count

def __init__(self, name):

self.name = name

person.count = person.count + 1

print person.how_many()

p1 = person('bob')

print person.how_many()

通過標記乙個@classmethod,該方法將繫結到person類上,而非類的例項。類方法的第乙個引數將傳入類本身,通常將引數名命名為cls,上面的cls.count實際上相當於person.count

Python基礎知識 物件導向

物件導向英文單詞 object oriented 簡稱 o o 物件導向的學習 物件導向的語法學習 簡單,靠記憶就行,比較多 物件導向的思想學習 稍微有點難度,主要是前期不太適應 物件導向的優勢 能夠實現良好的程式結構,方便程式的開發和管理維護 效率 執行效率 計算機 物件導向效率不如過程化的快 開...

python 基礎知識 物件導向 介紹

朋友 數量少!朋友越來越多,好朋友 普通朋友 一般朋友.朋友逐漸增加,閨蜜 知己 藍顏 紅顏.分類 人 認識世界 周圍的事情簡單 上小學,交作業 乙個乙個記憶 周圍的事情 複雜 上大學 貸款 做事情的步驟 周圍的事情 極度複雜 生活 進入社會 思考 三思而後行 還原過程 簡單的 操作 基礎語法,堆疊...

PHP 高階知識 物件導向

主要包含的內容 物件導向,設計模式,資料結構與演算法。物件導向和面向過程均為一種程式設計思想。面向過程 分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候乙個乙個依次呼叫即可。物件導向 把構成問題事務分解成各個物件,建立物件的目的不是為了完成乙個步驟,而是為了描述某個事物在解決...