标签:
▲定制类
Python中有许多类似__slots__这样有特殊用途的函数,可以帮助我们定制类。
官方文档链接:https://docs.python.org/3.4/reference/datamodel.html#special-method-names
1)__str__和__repr__
示例代码如下:
>>> class Student(object): ... def __init__(self, name): ... self.name = name ... >>> stu1 = Student(‘jack‘) >>> stu1 <__main__.Student object at 0x01740E70> >>> print(stu1) <__main__.Student object at 0x01740E70> >>> class Student(object): ... def __init__(self, name): ... self.name = name #print(stu1)调用__str__方法,返回用户看到的字符串 ... def __str__(self): ... return ‘Student object (name: %s)‘ % self.name ... >>> stu1 = Student(‘rose‘) >>> stu1 <__main__.Student object at 0x0174A030> >>> print(stu1) Student object (name: rose) >>> class Student(object): ... def __init__(self, name): ... self.name = name ... def __str__(self): ... return ‘Student object (name: %s)‘ % self.name #stu1调用__repr__方法,返回开发者看到的字符串 ... __repr__ = __str__ ... >>> stu1 = Student(‘michael‘) >>> stu1 Student object (name: michael) >>> print(stu1) Student object (name: michael)
2)__iter__和__getitem__()
如果一个class想要类似list或tuple一样可用于for..in..循环,需要实现__iter__()方法。该方法返回一个迭代对象(必须是自身self),然后for循环不断调用class实例的循环方法__next__()拿到下一个值,直至退出循环。
如果需要实例像list那样按照下标取出元素,需要实现__getitem__()方法。
示例代码如下:
#coding:utf-8 #创建一个fib数列迭代器 class Fib(object): def __init__(self): self.a, self.b = 0, 1 #实例本身就是迭代器,返回自身 def __iter__(self): return self #python3中next()方法改为__next__() def __next__(self): self.a, self.b = self.b, self.a + self.b if self.a > 500: raise StopIteration(); return self.a #__getitem__()可接收整数integer和切片slice 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 a, b = 1, 1 L = [] for x in range(stop): if x >= start: L.append(a) a, b = b, a + b return L for i in Fib(): print(i) print(‘-‘ * 50) print(Fib()[5]) print(‘-‘ * 50) print(Fib()[5:10])
运行结果:
1
1
2
3
5
8
13
21
34
55
89
144
233
377
--------------------------------------------------
8
--------------------------------------------------
[8, 13, 21, 34, 55]
3)__getattr__
当调用的类的属性或方法不存在时,会报错。但是我们使用__getattr__()方法写一个动态返回一个属性或方法。
只有在没有找到属性或方法时,才会在__getattr__中寻找。__getattr__()默认返回None。
4)__call__
一个对象可以由自己的属性和方法,我们调用方法一般通过instance.method()来调用。如果想要实现在实例本身上调用,需要定义__call__()方法。
通过callable()可以判断一个对象本身是否是可调用的。
▲元类metaclass
标签:
原文地址:http://www.cnblogs.com/wddoer/p/4261734.html