设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

史上最全Python面向对象编程(6)

发布时间:2019-03-26 14:51 所属栏目:21 来源:浪子燕青
导读:这是迭代器方法!列表、字典、元组之所以可以进行for循环,是因为其内部定义了 iter()这个方法。如果用户想让自定义的类的对象可以被迭代,那么就需要在类中定义这个方法,并且让该方法的返回值是一个可迭代的对象。

这是迭代器方法!列表、字典、元组之所以可以进行for循环,是因为其内部定义了 iter()这个方法。如果用户想让自定义的类的对象可以被迭代,那么就需要在类中定义这个方法,并且让该方法的返回值是一个可迭代的对象。当在代码中利用for循环遍历对象时,就会调用类的这个iter()方法。

普通的类:

  1. class Foo: 
  2.     pass 
  3. obj = Foo() 
  4. for i in obj: 
  5.     print(i) 
  6. # 报错:TypeError: 'Foo' object is not iterable<br># 原因是Foo对象不可迭代 
  7. 添加一个__iter__(),但什么都不返回: 
  8. class Foo: 
  9.     def __iter__(self): 
  10.         pass 
  11. obj = Foo() 
  12. for i in obj: 
  13.     print(i) 
  14. # 报错:TypeError: iter() returned non-iterator of type 'NoneType' 
  15. #原因是 __iter__方法没有返回一个可迭代的对象 

返回一个个迭代对象:

  1. class Foo: 
  2.     def __init__(self, sq): 
  3.         self.sq = sq 
  4.     def __iter__(self): 
  5.         return iter(self.sq) 
  6. obj = Foo([11,22,33,44]) 
  7. for i in obj: 
  8.     print(i) 

最好的方法是使用生成器:

  1. class Foo: 
  2.     def __init__(self): 
  3.         pass 
  4.     def __iter__(self): 
  5.         yield 1 
  6.         yield 2 
  7.         yield 3 
  8. obj = Foo() 
  9. for i in obj: 
  10.     print(i) 

10、len()

在Python中,如果你调用内置的len()函数试图获取一个对象的长度,在后台,其实是去调用该对象的len()方法,所以,下面的代码是等价的:

  1. len('ABC') 
  2. 'ABC'.__len__() 

Python的list、dict、str等内置数据类型都实现了该方法,但是你自定义的类要实现len方法需要好好设计。

11. repr()

这个方法的作用和str()很像,两者的区别是str()返回用户看到的字符串,而repr()返回程序开发者看到的字符串,也就是说,repr()是为调试服务的。通常两者代码一样。

  1. class Foo: 
  2.     def __init__(self, name): 
  3.         self.name = name 
  4.     def __str__(self): 
  5.         return "this is %s" % self.name 
  6.     __repr__ = __str__ 

12. add__: 加运算 _sub_: 减运算 _mul_: 乘运算 _div_: 除运算 _mod_: 求余运算 __pow: 幂运算

这些都是算术运算方法,需要你自己为类设计具体运算代码。有些Python内置数据类型,比如int就带有这些方法。Python支持运算符的重载,也就是重写。

  1. class Vector: 
  2.    def __init__(self, a, b): 
  3.       self.a = a 
  4.       self.b = b 
  5.    def __str__(self): 
  6.       return 'Vector (%d, %d)' % (self.a, self.b) 
  7.    def __add__(self,other): 
  8.       return Vector(self.a + other.a, self.b + other.b) 
  9. v1 = Vector(2,10) 
  10. v2 = Vector(5,-2) 
  11. print (v1 + v2) 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读