class Cat(object):
#靜態(tài)屬性,類的屬性
age="年后"
def __init__(self,name):
#實(shí)例屬性
self.name=name
注意點(diǎn)
ps:與JS不一樣的是,在python中靜態(tài)屬性也可以被實(shí)例化調(diào)用,但是前提是在實(shí)例屬性中沒(méi)有與靜態(tài)屬性相同的變量名稱
總結(jié)規(guī)則如下:
直接在類外賦給在類中未定義/定義的變量,那么如果是類名.變量名=value,則生成/改變的是靜態(tài)屬性,如果是實(shí)例對(duì)象名.變量名=value,那么生成/改變的是實(shí)例屬性
對(duì)于實(shí)例對(duì)象來(lái)說(shuō),調(diào)用直接的實(shí)例屬性,優(yōu)先于同名的靜態(tài)屬性
self.__age代表是私有變量
(ps:摘抄)
默認(rèn)情況下,Python中的成員函數(shù)和成員變量都是公開的(public)
在python中定義私有變量只需要在變量名或函數(shù)名前加上 ”__“兩個(gè)下劃線,那么這個(gè)函數(shù)或變量就是私有的了。
在內(nèi)部,python使用一種 name mangling 技術(shù),將 __membername替換成 _classname__membername,也就是說(shuō),類的內(nèi)部定義中,
所有以雙下劃線開始的名字都被"翻譯"成前面加上單下劃線和類名的形式。
例如:為了保證不能在class之外訪問(wèn)私有變量,Python會(huì)在類的內(nèi)部自動(dòng)的把我們定義的__spam私有變量的名字替換成為
_classname__spam(注意,classname前面是一個(gè)下劃線,spam前是兩個(gè)下劃線),因此,用戶在外部訪問(wèn)__spam的時(shí)候就會(huì)
提示找不到相應(yīng)的變量。 python中的私有變量和私有方法仍然是可以訪問(wèn)的;訪問(wèn)方法如下:
私有變量:實(shí)例._類名__變量名
私有方法:實(shí)例._類名__方法名()
其實(shí),Python并沒(méi)有真正的私有化支持,但可用下劃線得到偽私有。 盡量避免定義以下劃線開頭的變量!
(1)_xxx "單下劃線 " 開始的成員變量叫做保護(hù)變量,意思是只有類實(shí)例和子類實(shí)例能訪問(wèn)到這些變量,
需通過(guò)類提供的接口進(jìn)行訪問(wèn);不能用'from module import *'導(dǎo)入
(2)__xxx 類中的私有變量/方法名 (Python的函數(shù)也是對(duì)象,所以成員方法稱為成員變量也行得通。),
" 雙下劃線 " 開始的是私有成員,意思是只有類對(duì)象自己能訪問(wèn),連子類對(duì)象也不能訪問(wèn)到這個(gè)數(shù)據(jù)。
(3)__xxx__ 系統(tǒng)定義名字,前后均有一個(gè)“雙下劃線” 代表python里特殊方法專用的標(biāo)識(shí),如 __init__()代表類的構(gòu)造函數(shù)。
判斷對(duì)象所屬類
print(isinstance(cat1,Cat))#如果是Cat類的實(shí)例對(duì)象則返回True,否則返回False
類的繼承:python中類的繼承會(huì)繼承構(gòu)造函數(shù)
多重繼承中,如果有重名的方法,那么按照繼承的先后順序,只調(diào)用排在前面的那一個(gè)方法