python中实现定制类的特殊方法总结

588次阅读  |  发布于5年以前

看到类似slots这种形如xxx的变量或者函数名就要注意,这些在Python中是有特殊用途的。

slots我们已经知道怎么用了,len()方法我们也知道是为了能让class作用于len()函数。

除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类。

str

我们先定义一个Student类,打印一个实例:

复制代码 代码如下:

class Student(object):
... def init(self, name):
... self.name = name
...
print Student('Michael')
<main.Student object at 0x109afb190>

打印出一堆<main.Student object at 0x109afb190>,不好看。

怎么才能打印得好看呢?只需要定义好str()方法,返回一个好看的字符串就可以了:

复制代码 代码如下:

class Student(object):
... def init(self, name):
... self.name = name
... def str(self):
... return 'Student object (name: %s)' % self.name
...
print Student('Michael')
Student object (name: Michael)

这样打印出来的实例,不但好看,而且容易看出实例内部重要的数据。

但是细心的朋友会发现直接敲变量不用print,打印出来的实例还是不好看:

复制代码 代码如下:

s = Student('Michael')
s
<main.Student object at 0x109afb310>

这是因为直接显示变量调用的不是str(),而是repr(),两者的区别是str()返回用户看到的字符串,而repr()返回程序开发者看到的字符串,也就是说,repr()是为调试服务的。

解决办法是再定义一个repr()。但是通常str()和repr()代码都是一样的,所以,有个偷懒的写法:

复制代码 代码如下:

class Student(object):
def init(self, name):
self.name = name
def str(self):
return 'Student object (name=%s)' % self.name
repr = str

iter

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

我们以斐波那契数列为例,写一个Fib类,可以作用于for循环:

复制代码 代码如下:

class Fib(object):
def init(self):
self.a, self.b = 0, 1 # 初始化两个计数器a,b

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 # 返回下一个值  

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8