Python:13.定制類

# 定制類

# __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()
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容