Python:13.定制类

# 定制类

# __str__ 和 __repr__
class Student(object):
    def __init__(self, name):
        self.name = name

    # 返回用户看到的字符串
    def __str__(self):
        return 'Student object (name: %s)' % self.name

    # 返回程序开发看到的字符串,调试服务的。直接显示变量调用
    __repr__ = __str__

print(Student('Michael'))

s = Student('Mike')
print(s)

# __iter__
'''
1. 一个类被用于for...in循环,类似list或tuple
2. 该方法返回一个迭代对象,然后,for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环
'''
# 斐波那契数列
class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环条件
            raise StopIteration()
        return self.a #返回下一个值

    # __getitem__
    '''
    1. 类似list那样按照下标取出元素
    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. 调用不存在的属性时,调用该方法
'''
class Person(object):
    def __init__(self):
        self.name = 'Tom'

    def __getattr__(self, attr):# 默认返回 None
        if attr == 'score':
            return 99
        return AttributeError('\'Student\' object has no attribute \'%s\'' % attr)
# 链式应用
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__()方法,就可以直接对实例进行调用
2. 可以用callable()函数,判断一个对象是否是可调用对象
'''
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.定制类)