美文网首页
Python:13.定制类

Python:13.定制类

作者: 许瘦子来世 | 来源:发表于2018-07-11 18:11 被阅读5次
# 定制类

# __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.定制类

  • python 定制类

    python 中可以使用一些函数,对类进行定制,方便我们的使用。 比如slots函数、str函数、repr函数。。...

  • Swift5.1继承

    13.继承 重写1.重写:⼦类可以为继承来的实例方法,类方法,实例属性,类属性,或下标提供⾃己定制的实现。我们把这...

  • *(扩展)定制类

    用特殊方法定制类 ***********************#特殊方法是Python 中用来扩充类的强有力的方...

  • python中定制类

    python的特殊方法 特殊方法定义在class中 不需要直接调用 Python的某些函数或者操作符会调用对应的特...

  • python定制类__getitem__()方法

    今天在学习python的定制类,教程里面展示了如何用__getitem__方法,实现某个类的切片。pythoncl...

  • 2015.4.15

    晴 学习内容 1.python 廖雪峰python教程面对对象高级编程部分,剩下定制类和元类还没看 2.计算机组成...

  • 【Python】笔记19(定制类)

    回顾__slots__,用来限制class实例所能添加绑定的属性;.__len__用于调用该string类型的字符...

  • 【python】定制类(笔记摘录)

    让实例打印出来好看__str____repr__ __iter____next__该方法返回一个迭代对象,然后,P...

  • python学习(六)-定制类

    形如__xxx__的变量或者函数名在python中有特殊用途 __str__和__repr__ 把一个类的实例变成...

网友评论

      本文标题:Python:13.定制类

      本文链接:https://www.haomeiwen.com/subject/ujtkpftx.html