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