这是迭代器要领!列表、字典、元组之以是可以举办for轮回,是由于其内部界说了 iter()这个要领。假如用户想让自界说的类的工具可以被迭代,那么就必要在类中界嗣魅这个要领,而且让该要领的返回值是一个可迭代的工具。当在代码中操作for轮回遍历工具时,就会挪用类的这个iter()要领。
平凡的类:
- class Foo:
- pass
- obj = Foo()
- for i in obj:
- print(i)
- # 报错:TypeError: 'Foo' object is not iterable<br># 缘故起因是Foo工具不行迭代
- 添加一个__iter__(),但什么都不返回:
- class Foo:
- def __iter__(self):
- pass
- obj = Foo()
- for i in obj:
- print(i)
- # 报错:TypeError: iter() returned non-iterator of type 'NoneType'
- #缘故起因是 __iter__要领没有返回一个可迭代的工具
返回一个个迭代工具:
- class Foo:
- def __init__(self, sq):
- self.sq = sq
- def __iter__(self):
- return iter(self.sq)
- obj = Foo([11,22,33,44])
- for i in obj:
- print(i)
最好的要领是行使天生器:
- class Foo:
- def __init__(self):
- pass
- def __iter__(self):
- yield 1
- yield 2
- yield 3
- obj = Foo()
- for i in obj:
- print(i)
10、len()
在Python中,假如你挪用内置的len()函数试图获取一个工具的长度,在靠山,着实是去挪用该工具的len()要领,以是,下面的代码是等价的:
- len('ABC')
- 3
- 'ABC'.__len__()
- 3
Python的list、dict、str等内置数据范例都实现了该要领,可是你自界说的类要实现len要领必要好好计划。
11. repr()
这个要领的浸染和str()很像,两者的区别是str()返回用户看到的字符串,而repr()返回措施开拓者看到的字符串,也就是说,repr()是为调试处事的。凡是两者代码一样。
- class Foo:
- def __init__(self, name):
- self.name = name
- def __str__(self):
- return "this is %s" % self.name
- __repr__ = __str__
12. add__: 加运算 _sub_: 减运算 _mul_: 乘运算 _div_: 除运算 _mod_: 求余运算 __pow: 幂运算
这些都是算术运算要领,必要你本身为类计划详细运算代码。有些Python内置数据范例,好比int就带有这些要领。Python支持运算符的重载,也就是重写。
- class Vector:
- def __init__(self, a, b):
- self.a = a
- self.b = b
- def __str__(self):
- return 'Vector (%d, %d)' % (self.a, self.b)
- def __add__(self,other):
- return Vector(self.a + other.a, self.b + other.b)
- v1 = Vector(2,10)
- v2 = Vector(5,-2)
- print (v1 + v2)
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|