# 定制類
# __str__ 和 __repr__
class Student(object):
def __init__(self, name):
self.name = name
# 返回用戶看到的字符串
def __str__(self):
return 'Student object (name: %s)' % self.name
# 返回程序開發(fā)看到的字符串,調(diào)試服務(wù)的。直接顯示變量調(diào)用
__repr__ = __str__
print(Student('Michael'))
s = Student('Mike')
print(s)
# __iter__
'''
1. 一個類被用于for...in循環(huán),類似list或tuple
2. 該方法返回一個迭代對象,然后,for循環(huán)就會不斷調(diào)用該迭代對象的__next__()方法拿到循環(huán)的下一個值,直到遇到StopIteration錯誤時退出循環(huán)
'''
# 斐波那契數(shù)列
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化兩個計數(shù)器
def __iter__(self):
return self # 實例本身就是迭代對象,故返回自己
def __next__(self):
self.a, self.b = self.b, self.a + self.b # 計算下一個值
if self.a > 100000: # 退出循環(huán)條件
raise StopIteration()
return self.a #返回下一個值
# __getitem__
'''
1. 類似list那樣按照下標(biāo)取出元素
2. 切片方法
'''
def __getitem__(self, n):
if isinstance(n, int):
a, b = 1,1
for x in range(n):
a, b = b , a + b
return a
if isinstance(n, slice):
start = n.start
stop = n.stop
if start is None:
start = 0
a,b = 1, 1
L = []
for x in range(stop):
if x >= start:
L.append(a)
a, b = b , a + b
return L
for n in Fib():
print(n)
f = Fib()
print(f[0])
print(f[:3])
# __getattr__
'''
1. 調(diào)用不存在的屬性時,調(diào)用該方法
'''
class Person(object):
def __init__(self):
self.name = 'Tom'
def __getattr__(self, attr):# 默認(rèn)返回 None
if attr == 'score':
return 99
return AttributeError('\'Student\' object has no attribute \'%s\'' % attr)
# 鏈?zhǔn)綉?yīng)用
class Chain(object):
def __init__(self, path=''):
self._path = path
def __getattr__(self, path):
return Chain('%s/%s' % (self._path, path))
def __str__(self):
return self._path
__repr__ = __str__
p = Chain().status.user.timeline.list
print(p)
# __call__
'''
1. 任何一個類,只要定義一個__call__()方法,就可以直接對實例進行調(diào)用
2. 可以用callable()函數(shù),判斷一個對象是否是可調(diào)用對象
'''
class Men(object):
def __init__(self, name):
self.name = name
def __call__(self):
print('My name is %s' % self.name)
m = Men('Alex')
m()
Python:13.定制類
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 定制類 : 類里面有很多自帶的方法,我們可以重寫他們 _str_ print一個實例對象時會自動調(diào)用_str_方法...
- 今天在學(xué)習(xí)python的定制類,教程里面展示了如何用__getitem__方法,實現(xiàn)某個類的切片。pythoncl...
- 1.__getitem__的簡單用法: 當(dāng)一個類中定義了getitem方法,那么它的實例對象便擁有了通過下標(biāo)來索引...
- 做 個 有 趣 、有 故 事 的 人 關(guān)注 我們 開始 任何年齡,都可以擁有愛情。 但是,20來歲的年齡,不應(yīng)該擁...