跳转至

简介

本文主要介绍python中关于定制类(customizaiton class)的概念。

更详细的内容,可以参考python Basic customization

前期思考

先来一小段代码暖身:

#!/usr/bin/env python3

_list = [1, 2, 3, 4]
print(_list)
length = len(_list)
print(length)

上面这段代码的输出值是:

[1, 2, 3, 4]
4

我们写一个自定义类,重新调用上面的代码:

#!/usr/bin/env python3

class Person(object):
    pass

person = Person()
print(person)
length = len(person)
print(length)

上面的代码在我电脑上的输出值为:

<_main__.Person object at 0x102203278>
Traceback(most recent call last):
...
TyepError: object of type 'Person' has no len

我们可以看到,print(person)的输出值为<_main__.Person object at 0x102203278>, length = len(person)代码运行出错。

思考一下:

  • 为什么打印的_listperson的值会不一样?
  • 为什么len(person)会报错?

Person支持print

还记得在python中,类的构造函数形式是__init__,像这种在函数名称前后各有两个下划线的函数,是python中的保留函数名称,会在某些情况下调用。

让我们为Person函数实现一个__str__函数:

class Person(object):
    def __str__(self):
        return "I am a person"

person = Person()
print(person)

以上代码的输出值为:

I am a person

我们重写了__str__函数,这是我们调用print函数的时候,就可以将__str__返回值打印出来。 这也就是上面代码中_list可以打印出[1, 2, 3, 4]的愿意,因为它们按照自己的需要重写了__str__函数。

Person支持len函数

class Person(object):
    def __len__(self):
        return 0

person = Person()
length = len(person)
print(length)

运行上面的代码输出值为:

0

发现没, len函数最终调用了Person__len__函数,并将__len__函数的返回值进行返回。

总结

我们通过重写不同类型__xx__函数,来为我们的类提供不同的功能,这也是定制类的用法所在。当然__xx__形式的函数有很多,我们具体就要参考官方文档了。