類對于我們來講并不陌生峭范,很多語言都有類财松,比如OC、JS纱控、Java等辆毡,所有Python也自然有類的概念。
一甜害、Python中類的定義
Python中有兩種類(新式類與經(jīng)典類)舶掖,兩種類的比較,此文主要討論新式類
Python類 | 版本 | 特點(diǎn) | 多繼承特點(diǎn) | 方法對比 |
---|---|---|---|---|
經(jīng)典類 | Python2.x | 隱式不繼承object尔店,顯示繼承object 是新式類 | 采用廣度優(yōu)先搜索 | - |
新式類 | Python3.x | 隱式繼承object | 深度優(yōu)先搜索 | 新增 ___slots____ ____getattribute____ 內(nèi)置屬性 |
相同點(diǎn):
1.1 限制類的屬性 ____slots____ 是一個(gè)屬性限制列表
class Person:
__slots__ = ['age', 'height']
p = Person()
p.age = 10
p.height = 4
二眨攘、Python中類的屬性
聲明:Python里面并沒有真正的私有化主慰,但是可以使用下劃線(_)來完成偽私有化
x 公有屬性
_x(單下劃線) 受保護(hù)屬性
__x(雙下劃線) 私有屬性
xx(下劃線) 與系統(tǒng)的關(guān)鍵字區(qū)別
____xx____ 系統(tǒng)內(nèi)置的寫法
2.1受保護(hù)屬性的訪問限制
類的內(nèi)部 子類的內(nèi)部 可以訪問 模塊內(nèi) 跨模塊 有警告 跨模塊可以使用all字段申明可以跨模塊使用的屬性
2.2 私有屬性的訪問限制
只有在當(dāng)前類被訪問 ,不能被子類 模塊內(nèi)訪問 跨模塊訪問的規(guī)則和受保護(hù)屬性規(guī)則一致
2.3 @property 裝飾器 可以使用屬性的方式訪問屬性
class Person(object):
def __init__(self):
self.__age = 24
self.__weight = 140
@property
def age(self):
return self.__age
@age.setter
def age(self, value):
self.__age = value
@age.deleter
def age(self):
del self.__age
@property
def weight(self):
return self.__weight
p = Person()
p.age = 20
print(p.age)
print(p.weight)
print(p.__dict__)
2.4 常用的系統(tǒng)內(nèi)置屬性
__dict__ 查看屬性
__bases__ 查看所有父類的元類
__doc__ 查看類的描述
__name__ 查看類的名稱
__module__ 查看類定義所在的模塊
三鲫售、Python中類的方法
Python類中的方法有三種
- A共螺、類方法 (第一個(gè)參數(shù)是類)
- B、實(shí)例方法(第一個(gè)參數(shù)是實(shí)例)
- C情竹、靜態(tài)方法(沒有參數(shù))
類中的方法說明
class Person:
# 這是一個(gè)實(shí)例方法藐不,第一個(gè)參數(shù)必須接收一個(gè)實(shí)例 ,只有實(shí)例調(diào)用
def test(self):
print('這是一個(gè)實(shí)例方法,第一個(gè)參數(shù)必須接收一個(gè)實(shí)例', self)
# 這是一個(gè)類方法秦效,第一個(gè)參數(shù)必須接收一個(gè)類 實(shí)例和類都可以調(diào)用
@classmethod
def leifangfa(cls):
print('這是一個(gè)類方法雏蛮,第一個(gè)參數(shù)必須接收一個(gè)類', cls)
# 這是一個(gè)靜態(tài)方法,沒有參數(shù) 實(shí)例和類都可以調(diào)用
@staticmethod
def jintafanfa():
print('這是一個(gè)靜態(tài)方法阱州,沒有參數(shù)')
注意:不同方法里面訪問不同屬性的權(quán)限問題 方法里面能拿到實(shí)例就只能訪問實(shí)例屬性 方法里面能拿到類挑秉,就能拿到類屬性
3.1 私有化方法 與 私有化屬性一樣 都是加_(下劃線)
class Person(object):
# 私有屬性
__age = 10
# 私有方法 _Person__run()
def __run(self):
print('xxxxxxx')
# 覆蓋了__run方法 不能這么定義
def _Person__run(self):
print('ddd')
3.2 類常用的的內(nèi)置方法
A. 信息格式化操作
# 打印對象的內(nèi)容 - 描述對象
def __str__(self):
return '這個(gè)人的姓名是:%s, 這是人的年齡是:%s'%(self.name, self.age)
# 取實(shí)例對象的本質(zhì)信息:面向開發(fā)者人員
def __repr__(self):
return '獲取實(shí)例對象的本質(zhì)信息'
#調(diào)用操作__call__ 使一個(gè)對象具有函數(shù) 被調(diào)用的能力 可以通過p()調(diào)用
def __call__(self, *args, **kwargs):
print('xxxxx', args, kwargs)
B.索引操作:把對象當(dāng)做字典來操作
class Person(object):
def __init__(self):
self.cache = {}
def __setitem__(self, key, value):
print('__setitem__ ---key:%s --value : %s'%(key, value))
self.cache[key] = value
def __getitem__(self, item):
print('__getitem__ ---item:%s '%item)
return self.cache[key]
def __delitem__(self, key):
print('__delitem__ ---key:', key)
del self.cache[key]
p = Person()
p['name'] = 'zb'
print(p.__dict__)
print(p.cache['name'])
C.類的裝飾器
class checkName(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print('類的裝飾器的檢測')
self.func()
@checkName
def fashuoshuo():
print('發(fā)說說。贡耽。衷模。。蒲赂。')
// 調(diào)用
fashuoshuo()
最后贈言
學(xué)無止境阱冶,學(xué)習(xí)Python的伙伴可以多多交流。