Python学习笔记之魔法方法

魔法方法(特殊方法):名称以双下划线和双下划线结尾的方法。

这些方法会在特殊情况下被Python直接调用,几乎没有直接调用的必要。

__init__():构造函数

__del__():析构函数

在其他语言中对象可能被要求属于某一个类,或被要求实现接口,但在Python中只是简单的要求它遵守几个给定的规则。

如一个序列类,为了实现规则,则需要实现以下魔法方法:

__len__(self):返回集合中所含项目的数量

__getitem__(self,key):返回与所给键对应的值

__setitem__(self,key,value):修改

__delitem__(self,key):在使用del语句时调用

#创建一个无穷序列

def checkIndex(key):
    if not isinstance(key,int):
        print(‘it\‘s not a num‘)
        raise TypeError
    if key<0:
        raise ValueError
class ArithmeticSequence(object):
    """docstring for ArithmeticSequence"""
    def __init__(self, start = 0,step = 1):
        self.start = start
        self.step = step
        self.changed = {}

    def __getitem__(self,key):
        checkIndex(key)
        try:
            return self.changed[key]
        except KeyError:
            return self.start + key*self.step

    def __setitem__(self,key,value):
        checkIndex(key)
        self.changed[key] = value

s = ArithmeticSequence(1,2)
print(s[4])
s[4] = 2
print(s[4])
print(s[‘four‘])

#运行结果
Traceback (most recent call last):
it‘s not a num
  File "F:\Python_Program\input.py", line 32, in <module>
    print(s[‘four‘])
  File "F:\Python_Program\input.py", line 17, in __getitem__
    checkIndex(key)
  File "F:\Python_Program\input.py", line 6, in checkIndex
    raise TypeError
TypeError

对于这些特殊方法的实现可以直接通过继承列表等类。

property函数:

class  rectangle(object):
    """docstring for  rectangle"""
    def __init__(self):
        self.width = 0
        self.length = 0
    def set_size(self,size):
        self.width,self.length = size

    def getSzie(self):
        return self.width,self.length
    size = property(getSzie,set_size)

r = rectangle()
r.width = 5
r.length = 10
print(r.size)

property函数将size变成一个真正的特性,在使用property函数之前只可以通过访问器set_size和getSize来访问。

为了在访问特性时可以执行代码,必须使用以下魔法方法:

  • __getattribute__(self,name):当特性name被访问时自动调用
  • __getattr__(self,name):当特性name被访问且对象没有相应的的特性时自动调用
  • __setattr__(self,name,value):试图给特性name赋值时自动调用
  • __delattr__(self,name):试图删除特性时调用
class  rectangle(object):
    """docstring for  rectangle"""
    def __init__(self):
        self.width = 0
        self.length = 0
    def __setattr__(self,name,value):
        if name == ‘size‘:
            self.width,self.length = value
        else:
            self.__dict__[name] = value
    def __getattr__(self,name):
        if name == ‘size‘:
            return self.width,self.length
        else:
            raise AttributeError
    #size = property(getSzie,set_size)

r = rectangle()
r.width = 5
r.length = 10
print(r.size)

迭代器:

__iter__:迭代器规则的基础,会返回一个迭代器,迭代器就是一个具有__next__方法的对象,调用__next__方法时,迭代器会返回它的下一个值

class Fibs(object):
    """docstring for Fibs"""
    def __init__(self):
        self.a = 0
        self.b = 1
    def __next__(self):
        self.a,self.b = self.b,self.a + self.b
        return self.a
    def __iter__(self):
        return self

fibs = Fibs()
for s in fibs:
    if s > 1000:
        print(s)
        break
        

内建函数iter可以从可迭代对象中获得迭代器

class Fibs(object):
    """docstring for Fibs"""
    def __init__(self):
        self.a = 0
        self.b = 1
    def __next__(self):
        self.a,self.b = self.b,self.a + self.b
        return self.a
    def __iter__(self):
        return self

fibs = Fibs()
x = iter(fibs)
print(x.__next__())

#运行结果
1
[Finished in 0.9s]

生成器:一种用普通函数语法定义的迭代器。

以下举例说明生成器

对于一个嵌套列表的列表,打印列表中的数字

def flatten(nested):
    for sublist in nested:
        for i in sublist:
            yield i

nested = [[1,2,3],[2,3],[1]]
for num in (flatten(nested)):
    print(num)

1
2
3
2
3
1
[Finished in 0.1s]

任何包含yield的函数称为生成器,它每次产生多个值,每产生一个值函数就被冻结,函数被重新唤醒后就从停止那里开始执行。

如果要对内嵌类型不明的列表进行迭代

def flatten(nested):
    try:
        try:
            nested + ‘ ‘
        except TypeError:
            pass
        else:
            raise TypeError
        for sublist in nested:
            for i in flatten(sublist):
                yield i
    except TypeError:
        yield nested

nested = [[1,2,3],[2,3],1,‘abc‘]
for num in (flatten(nested)):
    print(num)
时间: 2024-10-06 12:21:55

Python学习笔记之魔法方法的相关文章

20161217py学习笔记:魔法方法/

1.魔法方法也是method,也是定义class中用到函数,只不过这些函数的名字,前后都是双下划线. 初始化:__init__ class FooBar: def __init__(self,value=42): self.somevar=value 原来想用'somevar',大概得这么写: >>>f=FooBar() >>>f.__init__ #如果__init__下还有几个self.some*,这么一写得全引用出来,但是我们想用的只是somevar,所以用__i

python学习笔记(二)-字符串方法

python的字符串内建函数: #====================常用方法=============================name = 'besttest' new_name = name.strip() #默认是去掉两边的空格和换行符 new_name= name.lstrip() #默认是去掉左边的空格和换行符 new_name= name.rstrip()#默认是去掉右边边的空格和换行符 new_name = name.count('t')#查找某个字符串在字符串里面出现

python 学习笔记 7 -- Python关键字总结

0.写在前面的话 学习一门语言最重要的功课是练习与复习,在<笨方法学Python>中第三十七节虽然没有教你任何内容,但是它提醒我们:"学了这么多,你还能记得多少?该复习了!" 下面我们就对这一节的第一部分"关键字"来做个复习: Python中的关键字包括如下: and       del        from      not      while    as        elif       global    or       with     

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

python学习笔记12-模块使用

python学习笔记12-模块使用 模块os,sys 什么是模块? 模块os,sys 模块是Python组织代码的一种基本方式 一个Python脚本可以单独运行,也可以导入到另外一个脚本运行,用import hello语句来导入,不用加入.py 什么是Python的 包? Python的模块可以按照目录组织为包 创建一个包的步骤: 创建一个名字为包名的目录 在改目录下创建一个__init__.py文件 根据需要,在该目录下存放脚本文件或已编译的扩展及子包 import pack.m1,pack.

python学习笔记2—python文件类型、变量、数值、字符串、元组、列表、字典

python学习笔记2--python文件类型.变量.数值.字符串.元组.列表.字典 一.Python文件类型 1.源代码 python源代码文件以.py为扩展名,由pyton程序解释,不需要编译 [[email protected] day01]# vim 1.py #!/usr/bin/python        print 'hello world!' [[email protected] day01]# python 1.py hello world! 2.字节代码 Python源码文件

Python学习笔记--未经排版

Python 学习笔记 Python中如何做到Print() 不换行 答:Print("输出内容",end='不换行的分隔内容'),其中end=后面为2个单引号 注:在Python 2.x中,Print "输出内容", 即在输出内容后加一逗号 Python中 is 和 == 的区别 答:Python中的对象包含三要素:id.type.value 其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值 is判断的是a对象是否就是b对象,是通过id来

Python学习笔记_Python对象

Python学习笔记_Python对象 Python对象 标准类型 其他内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比较 对象身份比较 布尔类型 标准类型的内建函数 typeObj cmpobj1 obj2 strobj reprobj typeobj isinstanceobj 标准类型的分类 存储模型 更新模型 访问模型 不支持的类型 Python学习笔记_Python对象 首先来理解一个通俗的含义,什么是对象?其实对象无论在什么语言里面

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd