Python学习8——魔法方法、特性和迭代器
Python中很多名称比较古怪,开头和结尾都是两个下划线。这样的拼写表示名称有特殊意义,因此绝不要在程序中创建这样的名称。这样的名称中大部分都是魔法(方法)的名称。如果你的对象实现了这些方法,他们将在特定情况下(具体是何种情况取决于方法的名称)被Python调 用,而几乎不需要直接调用。
1、构造函数
你可能从未听说过过构造函数,它其实就是我们之前示例中使用的初始化方法,只是命名为__init__。然而构造函数不同于普通方法的地方在于,将在对象创建时自动调用它们。
>>> class FooBar:
def __init__(self):
self.somevar=42 >>> f=FooBar()
>>> f.somevar
42
如果创建对象时带上参数
>>> class FooBar:
def __init__(self,value=42):
self.somevar=value >>> f=FooBar("This is a init funcation")
>>> f.somevar
'This is a init funcation'
在所有方法中__init__绝对是使用最多的方法
Python提供了析构方法 __del__ 这个方法在对象被销毁之前被调用,但鉴于你不知道什么时间调用,所以最好不要用到。
1.1重写普通方法和特殊的构造方法
鉴于之前的JAVA基础,在学习之后发现,面向对象编程此处没有什么区别,因此只做简单复习。
重写是继承机制的一个重要方面,对构造函数来说尤其重要。构造函数由于初始化新建对象的状态,而对大多数子类来说,除了超类的初始化代码之外,还需要有自己的初始化代码。
虽然重写的机制都一样,但构造函数的重写,必须要调用超类的构造函数农户,否则会引发异常。
有的时候子类的构造函数重写的,导致新的构造函数没有包含任何超类构造函数中的代码,导致出现错误。为了解决这个问题,子类的构造函数必须调用其超类的构造函数,以确保基本的代码会得到执行。为此,有两种方法,调用未关联的超类构造函数,以及使用函数super。
1.2调用未关联的超类函数
>>> class Bird:
def __init__(self):
self.hungry=True
def eat(self):
if self.hungry:
print("I'm hungry.....weishizhong....")
self.hungry=False
else :
print("No,thanks!I'm OK.") >>> class SingBird(Bird):
def __init__(self):
Bird.__init__(self)
self.sound="qiu qiu qiu..."
def sing(self):
print(self.sound) >>> newbird=SingBird()
>>> newbird.sing()
qiu qiu qiu...
>>> newbird.eat()
I'm hungry.....weishizhong....
>>> newbird.eat()#即使Singbird未定义eat方法,仍然可以使用hungry变量
No,thanks!I'm OK.
为什么可以这样哪?对实例调用方法时,方法的参数self将会自动关联到实例。然而,如果你通过类调用方法,就没有实例与之相关联。在这种情况下你可以随便设置参数self。这样的方法称为未关联的。
通过将这个未关联方法的self参数设置为当前实例,将使用超类的构造函数来初始化SingBird对象,这意味着将设置属性hungry。
1.3使用函数super()
super函数只适用于Python3版本,而且你应该这样做,而尽量不要采用上面的方法。
>>> class Bird:
def __init__(self):
self.hungry=True
def eat(self):
if self.hungry:
print("I'm hungry.....weishizhong....")
self.hungry=False
else :
print("No,thanks!I'm OK.") >>> class SingBird(Bird):
def __init__(self):
super().__init__()
self.sound="qiu qiu qiu..."
def sing(self):
print(self.sound) >>> newbird=SingBird()
>>> newbird.sing()
qiu qiu qiu...
>>> newbird.eat()
I'm hungry.....weishizhong....
>>> newbird.eat()#即使Singbird未定义eat方法,仍然可以使用hungry变量
No,thanks!I'm OK.
使用super 的优点,即使有很多超类,只用使用一次super 就可以了,super是什么你根本不用去管!!!
2、元素访问
基本的序列和映射协议非常简单,但要实现序列和映射的所有功能,需要很多魔法方法,后面会学习到。
在Python中协议通常指的是规范行为的规则,有点类似之前提到的接口。协议指定应实现哪些方法以及这些方法应做什么。
2.1基本的序列和映射协议
序列和映射基本上是元素的集合,要实现他们的基本行为(协议),不可变对象需要实现两个方法,而可变对象需要四个。
__len__(self)
__getitem(self,key)
__setitem__(self, key, value)
__delitem__(self, key)
Python学习8——魔法方法、特性和迭代器的更多相关文章
- Python学习之魔法方法
Python中会看到前后都加双下划线的函数名,例如 __init__(self),这类写法在Python中具有特殊的含义.如果对象使用了这类方法中的某一个,那么这个方法将会在特殊的情况下被执行,然而几 ...
- 零基础学习python_魔法方法(41-48课)(迭代器)
接下来这个为啥要叫魔法方法呢,额,这个嘛我是跟小甲鱼的视频取的名字一样的,因为会讲比较多杂的东西,有... 魔法方法详细阅读地址:http://bbs.fishc.com/thread-48793-1 ...
- python类之魔法方法
python类之魔法方法: class A(object): def __init__(self,x): self.x = x def __neg__(self): print('-v') def _ ...
- python里的魔法方法1(构造与析构)
魔法方法——构造与析构 1.python编程的魔法方法: (1)魔法方法总是被双下划线包围,例如__init__: (2)魔法方法是面向对象的python的一切. 2.__new__(class[,… ...
- python基础之魔法方法
由于hexo自带的markdown渲染引擎对双下划线做了转义,在正文中看到的魔法方法前后都没有双下划线 setattr.getattr.delattr 可以拦截对对象属性的访问 setattr函数是用 ...
- python_魔法方法(六):迭代器和生成器
迭代器 自始至终,都有一个概念一直在用,但是我们却没来都没有人在的深入剖析它.这个概念就是迭代. 迭代的意思有点类似循环,每一次的重复的过程被称为迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭 ...
- Python中的魔法方法
1.什么是魔法方法? 魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一 ...
- python中类的魔法方法
__xx__这种方法,在Python中均称为魔法方法 1.__init__(self) 该方法的作用是初始化对象 在创建对象时被默认调用,不需要手动调节 self参数不需要开发者传递,解释器会自动将创 ...
- 【Python学习之五】高级特性5(切片、迭代、列表生成器、生成器、迭代器)
5.迭代器 由之前的生成器可知,for循环用于可迭代对象:Iterable.包括集合数据类型: list.tuple.dict.set.str 等,以及两种生成器.判断迭代器,使用 isinstanc ...
随机推荐
- Manacher 算法学习小记
概要 一个字符串有多少个回文的字串?最多有 \(O(n^2)\) 级别个.但 Manacher 算法却可以用 \(O(n)\) 的时间复杂度解决这个问题.同时 Manacher 算法实现非常简单. 一 ...
- Mybatis源码学习之反射工具(三)
简述 MyBatis在进行参数处理.结果映射等操作时,会涉及大量的反射操作.Java中的反射虽然功能强大,但是代码编写起来比较复杂且容易出错,为了简化反射操作的相关代码,MyBatis提供了专门的反射 ...
- 2017 ZSTU寒假排位赛 #7
题目链接:https://vjudge.net/contest/149498#overview. A题,水题,直接按照题意模拟一下即可. B题,我用的是线段树.大力用的差分标记(上次听zy说过,下次再 ...
- HDU 3394 Railway —— (点双联通,记录块信息)
这题是比较模板的找点双联通并记录的题目. 题意大概是:一个公园有n个景点,1.所有游客都是绕环旅游的,找出所有不在环内的路的条数:2.如果两个环中有重复的边,那么这些边是冲突的,问冲突的边的总数. 分 ...
- Linux设备驱动程序 之 主次设备号
主设备号和次设备号 对字符设备的访问是通过文件系统内的设备名称进行的,这些名称被称为特殊文件.设备文件.或者简单称之为文件系统树的节点,它们通常位于/dev目录.字符设备驱动程序的设备文件可以通过ls ...
- ubuntu进行apt-get时候出现Package ssh is not available, but is referred to by another package 错误
今天在ubuntu进行ssh安装的时候,出现如下错误. Reading package lists... Done Building dependency tree... Done Package s ...
- 【Spark机器学习速成宝典】推荐引擎——协同过滤
目录 推荐模型的分类 ALS交替最小二乘算法:显式矩阵分解 Spark Python代码:显式矩阵分解 ALS交替最小二乘算法:隐式矩阵分解 Spark Python代码:隐式矩阵分解 推荐模型的分类 ...
- Java 比较两个字符串的相似度算法(Levenshtein Distance)
转载自: https://blog.csdn.net/JavaReact/article/details/82144732 算法简介: Levenshtein Distance,又称编辑距离,指的是两 ...
- P4104 [HEOI2014]平衡
友情提醒:取模太多真的会TLE!!! P4104 [HEOI2014]平衡 题解 本题属于 DP-整数划分 类问题中的 把整数 n 划分成 k 个不相同不大于 m 的正整数问题 设置DP状态 f[ ...
- <JavaScript>“浏览器模式”和“文档模式”之间的区别
只有IE浏览器中才会有“浏览器模式”和“文档模式”,兼容性视图涉及两个重要的功能便是“浏览器模式[browser mode]”和“文档模式[document mode]”,在IE8/IE9中按F12键 ...