接下来这个为啥要叫魔法方法呢,额,这个嘛我是跟小甲鱼的视频取的名字一样的,因为会讲比较多杂的东西,有。。。

  魔法方法详细阅读地址:http://bbs.fishc.com/thread-48793-1-1.html

  啥是魔法方法呢?

 魔法方法是“面向对象”python的一切,一般被双下划线包围着,例如__init__(self[,...]);

 __init__这个是一个构造函数,在类里面一般用于属性初始化,返回值为Null,不要在__init__函数下return值。

  我们在实例化对象的时候,大部分的人会觉得调用的第一个魔法方法应该是__init__,但其实不是,第一个被调用的应该是__new__(cls[,...])(注意第一个参数是类class),返回一个实例对象,通常返回是这个class类的对象(也可以返回其它对象),举个例子看下:

下面还有一个析构函数,也就是__del__(self),注意:当所有对这个对象的引用都被删除时(也就是最后一个引用被删除时),就会启动垃圾回收机制,就会调用__del__方法。

注意:只有最后引用都删除了才会调用del方法!

下面给大家简单介绍下魔法方法中属性访问:

上面是4个类的魔法方法,下面举个例子大家看下

class Att():
def __getattribute__(self, name):
print("__getattribute__")
return super().__getattribute__(name) #调用基类的__getattribute__ def __getattr__(self, name):
print("__getattr__") def __setattr__(self, name, value):
print("__setattr__")
super().__setattr__(name, value) def __delattr__(self,name):
print("__delattr__")
super().__delattr__(name)

调用结果如下:

>>> a = Att()
>>> a.x #x属性之前没有,因此调用顺序如下
__getattribute__
__getattr__
>>> a.x = 1
__setattr__
>>> a.x #x属性存在后,getattr就不会被调用了
__getattribute__
1
>>> del a.x
__delattr__

描述符的介绍:

描述符是一种具有“捆绑行为”的对象属性。访问(获取、设置和删除)它的属性时,实际是调用特殊的方法(_get_(),_set_(),_delete_())。也就是说,如果一个对象定义了这三种方法的任何一种,它就是一个描述符。

定制序列->容器

    容器类型的协议
如果说你希望定制的容器是不可变的话,你只需要定义__len__()和__getitem__()方法。
如果你希望定制的容器是可变的话,除了__len__()和__getitem__()方法,你还需要定义__setitem__()和__delitem__()两个方法。
题目:定制一个列表,要求记录列表中每个元素被访问的次数。要求支持append()等原生列表的方法

要求1:实现获取、设置和删除一个元素的行为(删除一个元素的时候对应的计数器也会被删除)
要求2:增加counter(index)方法,返回index参数所指定的元素记录的访问次数
要求3:实现append()、pop()、remove()、insert()、clear()和reverse()方法(重写这些方法的时候注意考虑计数器对应的变化)

代码如下:

class Countlist(list):
def __init__(self, *args):
super().__init__(args)
self.count = []
for i in args:
self.count.append(0) def __len__(self):
return len(self.count) def __getitem__(self, key):
self.count[key] += 1
return super().__getitem__(key) def __setitem__(self, key, value):
self.count[key] += 1
super().__setitem__(key, value) def __delitem__(self, key):
del self.count[key]
super().__delitem__(key) def counter(self, key):
return self.count[key] def append(self, value):
self.count.append(0)
super().append(value) def pop(self, key=-1):
del self.count[key]
return super().pop(key) def remove(self, value):
key = super().index(value)
del self.count[key]
super().remove(value) def insert(self, key, value):
self.count.insert(key, 0)
super().insert(key, value) def clear(self):
self.count.clear()
super().clear() def reverse(self):
self.count.reverse()
super().reverse(self)

迭代器(迭代的容器,有例如序列、列表、元组、字典等)

迭代操作提供了两个内置函数

  • iter() 将对象变成迭代器
  • next() 迭代器返回下一个值(如果没有值了,就会抛出异常StopIteration)

举个例子大家看下:

string = 'fishc'
it = iter(string)
while True:
try:
each = next(it)
print(each)
except StopIteration:
break

结果如下:

迭代器的魔法方法如下:

  • __iter__() (容器如果是迭代器,就必须实现__iter__这个魔法方法,返回迭代器本身,return self)
  • __next__()(决定了迭代器的规则)

举个例子:


题目:斐波那契数列

代码如下
class Fibl:
def __init__(self, n = 20):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a >= self.n:
raise StopIteration
return self.a
结果如下:

关于迭代器的题目:

要求自己写一个MyRev类,功能与reversed()相同(内置函数reversed(seq)是返回一个迭代器,是序列seq的逆序显示),例如:

代码如下:

class MyRev:
def __init__(self, value):
self.value = value
self.index = len(value) def __iter__(self):
return self def __next__(self):
if self.index == 0:
raise StopIteration self.index -= 1
return self.value[self.index]

零基础学习python_魔法方法(41-48课)(迭代器)的更多相关文章

  1. 怎么规划一个零基础学习Unity3D的“方法”或者“流程”?

    具体出处:https://www.zhihu.com/question/35542990 我只是一个计算机相关专业毕业的,已经掌握了基础的C#并开发过.net的.目前突然心血来潮对unity3D有兴趣 ...

  2. 零基础学习python_类和对象(36-40课)

    今天我们开始学习面向对象的知识咯,之前我对面向对象也学的懵懵的,因为感觉知道好像又不是特别清楚,接下来我们一起来学习类和对象吧.零基础的课程我都是看小甲鱼的视频学的,没基础的可以去这个网址下载视频学习 ...

  3. Python学习8——魔法方法、特性和迭代器

    Python中很多名称比较古怪,开头和结尾都是两个下划线.这样的拼写表示名称有特殊意义,因此绝不要在程序中创建这样的名称.这样的名称中大部分都是魔法(方法)的名称.如果你的对象实现了这些方法,他们将在 ...

  4. 零基础学习python_字符串(14-15课)

    今天回顾下我之前学习python的第一个对象——字符串,这个对象真蛋疼,因为方法是最多的,也是最常见的类型,没有之一... 内容有点多,我就搜了下网上的资料,转载下这个看起来还不错的网址吧:http: ...

  5. 零基础学习python_字典(25-26课)

    今天学到后面的知识,突然发现之前学习到的字典列表啥的都有点忘了,打算补一下之前学到的字典,到时候你看的时候,字符串.列表.字典.元祖这几个没啥顺序,刚开始学的时候了解下方法,当然你可以死记硬背下,后面 ...

  6. 零基础学习python_文件(28-30课)

    本人小白一枚,随着现在对测试要求越来越高,动不动就要去会一门编程语言,没办法只能学习学习Python,今天看到几个月前还是菜鸟的人突然就已经能使用Python写简单系统了,没办法,虽然之前也简单学习过 ...

  7. 零基础学习python_爬虫(53课)

    1.Url的格式简单介绍,如下图: 2.我们要对网站进行访问,需要用到python中的一个模块或者说一个包吧,urllib(这个在python2中是urllib+urllib2,python3将这两个 ...

  8. 零基础学习python_模块(50-52课)

    今天学了下模块,那什么是模块呢?其实我们写的以py结尾的一个文件就是一个模块,模块也就是程序 还记得我们之前学过容器.函数.类吧 容器    ->    数据的封装 函数    ->   ...

  9. 零基础学习python_生成器(49课)

    一个生成器函数的定义很像一个普通的函数,除了当它要生成一个值的时候,使用yield关键字而不是return.如果一个def的主体包含yield,这个函数会自动变成一个生成器(即使它包含一个return ...

随机推荐

  1. java类加载与static

    一.类加载 当jvm去运行一个类时,会先加载该类,把该类在硬盘上字节码加载到jvm的内存.java HelloWorld>字节码会被加载到代码段中>加载过程中会有一些静态的常量,这部分会事 ...

  2. windows环境下把Python代码打包成独立执行的exe

    windows环境下把Python代码打包成独立执行的exe可执行文件   有时候因为出差,突然急需处理一批数据.虽然写好的脚本存储在云端随用随取,然而编译的环境还需要重新搭建,模块也需要重新装载,从 ...

  3. C#之实现Scoket心跳机制

    C#之实现Scoket心跳机制 标签: UnityC#TCPSocket心跳 2017-05-17 09:58 1716人阅读 评论(0) 收藏 举报  分类: Unity(134)  C#(6)  ...

  4. 数据仓库专题(21):Kimball总线矩阵说明-官方版

    一.前言 Over the years, I have found that a matrix depiction of the data warehouse plan is a pretty goo ...

  5. [蓝桥杯]ALGO-116.算法训练_最大的算式

    问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号 ...

  6. LeetCode——14. Longest Common Prefix

    一.题目链接:https://leetcode.com/problems/longest-common-prefix/ 二.题目大意: 给定若干个字符串,找出它们的最长公共子串. 三.题解: 这道题目 ...

  7. Oracle事务隔离级别处理差异

    Oracle事务隔离是事务读操作不同程度的数据隔离,分为READ_UNCOMMITTED.READ_COMMITTED(默认).SERIALIZABLE. Oracle事务隔离级别SERIALIZAB ...

  8. file /usr/lib64/mysql/plugin/dialog.so from install of Percona-Server-server-56-5.6.24-rel72.2.el6.x86_64 conflicts with file from package mariadb-libs-1:5.5.60-1.el7_5.x86_64

    !!!点下面!!! https://www.cnblogs.com/chuijingjing/p/10005922.html

  9. docker容器里面安装ssh

    docker容器里面安装ssh https://blog.csdn.net/chengxuyuanyonghu/article/details/76619097

  10. 廖雪峰Java3异常处理-1错误处理-2捕获异常

    1捕获异常 1.1 finally语句保证有无错误都会执行 try{...}catch (){...}finally{...} 使用try...catch捕获异常 可能发生异常的语句放在try{... ...