Python——定制类

一、定制类

重写python内置的函数、异常、对象。

__str__()和__repr__()

类似于Java里的toString()

class Dog(object):
    def __str__(self):
        return "汪汪汪"
>>>dog=Dog()
>>>print(dog)
汪汪汪

但是,不加print,直接输入dog

>>> dog
<__main__.Dog object at 0x0000021069502160>

这时,我们要用到__repr__()了:

class Dog(object):
    def __repr__(self):
        return "汪汪汪"
>>>dog=Dog()
>>>print(dog)
汪汪汪
>>>dog
汪汪汪

__str__()用于显示给用户,而__repr__()用于显示给开发人员。

__str____repr__函数会被子类继承。

__iter__()和__next__()

遍历对象

类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

class Language(object):
    def __init__(self):
        self.count = 0
def __iter__(self):
    return self  # 实例本身就是迭代对象,故返回自己

def __next__(self):
    self.count += 1
    if self.count &gt; 3:
        raise StopIteration()
    return self.countlanguage = Language()
    for i in language:
print(i)
1
2
3

getitem()

按照下标取出元素

class Fib(object):
    def __getitem__(self, n):
        a, b = 1, 1
        for x in range(n):
            a, b = b, a + b
        return a

这样,就可以按照下标访问数列了:

>>> f = Fib()
>>> f[1]
1
>>> f[10]
89
>>> f[100]
573147844013817084101

类似于list的切片方法:

__getitem__()传入的参数可能是一个int,也可能是一个切片对象slice,所以要做判断:

class Fib(object):
    def __getitem__(self, n):
        if isinstance(n, int): # n是索引
            a, b = 1, 1
            for x in range(n):
                a, b = b, a + b
            return a
        if isinstance(n, slice): # n是切片
            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

实现效果:

>>> f = Fib()
>>> f[0:5]
[1, 1, 2, 3, 5]

此外,如果把对象看成dict__getitem__()的参数也可能是一个可以作keyobject,例如str

__setitem__() 给某个元素赋值

__delitem__() 删除某个元素

__getattr__()

当调用不存在的属性时,才会去调用它

class Student(object):
def __getattr__(self, attr):
        if attr=='score':
            return 99

Student类中没有score这个属性,所以去调用__getattr__

>>> s = Student()
>>> s.score
99

也可以返回函数:

def __getattr__(self, attr):
        if attr=='age':
            return lambda: 25

如果__getattr__中也找不到这个属性,默认返回'None'。

__call__()

把类实例变成可调用对象,模糊了对象和函数的概念

class Student(object):
    def __init__(self, name):
        self.name = name
def __call__(self):
    print('My name is %s.' % self.name)
    &gt;&gt;&gt; s = Student('Michael')
    &gt;&gt;&gt; s() # self参数不要传入
    My name is Michael.

如果一个对象能被调用,我们就称之为Callable对象,比如上面带有call()的类实例:

>>> callable(Student())
True
>>> callable(max)
True
>>> callable([1, 2, 3])
False
>>> callable(None)
False
>>> callable('str')
False

通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。

其它博客链接:

  1. 变量和数据类型
  2. list和tuple
  3. 条件语句和循环
  4. dict和set
  5. 函数
  6. 切片+迭代+生成器
  7. 生成器和迭代器
  8. 函数式编程
  9. 模块
  10. 面向对象编程
  11. 面向对象高级编程
  12. 定制类
  13. 枚举类和元类
  14. 错误及处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值