在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法"。比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法。

构造函数

构造函数不同于普通方法,将在对象创建后自动调用它们。也就是在对象创建完成后,自动会调用__init__方法来初始化。

创建一个构造方法

构造方法传参

>>> class FooBar:

    def __init__(self,value=42): #默认参数

        self.somevar = value

>>> f = FooBar('This is a constructor argumnet')

>>> f.somevar

'This is a constructor argumnet'

构造方法的重写

普通方法就不说了,一下是特殊方法的重写方式:

1.调用超类构造方法的未绑定版本;2.使用super函数

(1)调用未绑定的超类构造方法:Bird.__init__(self)

(2)使用super函数 super(SongBird, self).__init__()

当前的类和对象可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前类的方法。也就是说函数super返回的是一个super对象,这个对象为你执行方法解析,当你访问它的属性时,它将在所有的超类中查找,直到找到指定属性或者引发AttributeError异常。通常使用super()函数不提供任何参数方式。

成员访问

基本的序列和映射规则

序列和映射是对象的集合,对象不可变,需使用2个魔法方法;对象可变需使用4个

(1)__len_(self):这个方法返回集合中所含项目的数量。对于序列就是元素的个数;对于映射则是键-值对的数量。

(2)__getitem__(self,key):这个方法返回与所给键对应的值。对于序列:键应该是一个0~n-1的整数,n是序列的长度;对于映射:可以使用任何种类的键。

(3)__setitem__(self,key,value):这个方法按一定的方式存储和key相关的value,该值随后可使用__getitem__来获取。

(4)__delitem__(self,key):对一部分对象使用del语句是被调用,同时必须删除和元素相关的键;可修改对象定义的(并不是删除全部的对象,而只删除一些需要移除的元素)

下面是一个无穷序列的例子:

子类化列表,字典和字符串

特性--property函数

property函数可以用0,1,2,3或者4个参数来调用。

property的4个参数分别被叫做fget,fset,fdel和doc。

没有指定参数创建的特性将不可读写,指定一个参数只读,第三个参数可选,用于删除属性的方法,第四个也是可选,指定一个文档字符串。

在新式类中应该使用property函数而不是访问器方法。

静态方法和类成员方法

静态方法:定义没有self参数,并且能够被类本身直接调用

类成员方法:定义时需要名为cls的类似于self的参数,类成员方法可以直接用类的具体对象调用,cls参数是自动被绑定到类的。

class MyClass:

    def smeth():

        print('This is a static method')

        smeth = staticmethod(smeth)

    def cmeth(cls):

        print('This is a class method of', cls)

        cmeth = classmethod(cmeth)

装饰器:使用@操作符

>>> class MyClass:

    @staticmethod

    def smeth():

        print('This is a static method')

    @classmethod

    def cmeth(cls):

        print('This is a class method of',cls)

>>> MyClass.smeth() #静态方法:定义没有self参数,并且能够被类本身直接调用

This is a static method

>>> MyClass.cmeth()

This is a class method of <class '__main__.MyClass'>

__getattr__、__setattr__等

拦截对象的所有特性访问是可能的

魔法方法(可以对处理很多属性的方法进行再编码)

(1)__getattribute__(self,name):当特性name被访问时自动被调用(只能在新式类中使用)

(2)__getattr__(self,name):当特性name被访问且对象没有相应的特性时被自动调用。

(3)__setattr__(self,name,value):当试图给特性name赋值时会被自动调用。

(4)__delattr__(self,name):当试图删除特性name时被自动调用。

特殊方法__dict__,该方法包含一个字典,字典里面是所有实例的属性,为避免__setattr__方法被再次调用(这样程序陷入死循环),__dict__方法被用来代替普通的特性赋值操作。

迭代器

列表会占用太多内存,使用迭代器更通用、简单优雅。

特殊方法:__iter__,这个方法是迭代器规则的基础

__iter__方法返回一个迭代器,它是包含方法__next__的对象,而调用这个方法时可以不提供参数。当调用方法__next__时,迭代器返回其下一个值。如果迭代器没有可提供返回的值,引发StopIteration异常。

实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。

从迭代器得到序列

使用list构造方法显示地将迭代器转化为列表

>>> class TestIterator:

        value = 0

        def __next__(self): #此处是python3.0的版本,3.0以前的版本是用def next(self):

            self.value +=1

            if self.value >10:

                raise StopIteration

            return self.value

        def __iter__(self):

            return self

>>> ti = TestIterator()

>>> list(ti)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成器

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

创建生成器(处理两层嵌套)

功能:顺序打印出列表中的数字

生成器与函数的区别在于,生成器不是使用return返回一个值,而是可以生成多个值,每次一个。每次使用yiled生成一个值后,函数都将冻结,停止执行,等待重新被唤醒。被重新唤醒之后,函数将从停止的地方开始继续执行。

递归生成器

如果要处理任意层嵌套的列表,每一层都需要一个for循环,也可以使用递归。

通用生成器

生成器是一个包含yield关键字的函数,当它被调用时,在函数体中的代码不会被执行,而返回一个迭代器。

每次请求一个值,就会执行生成器中的代码,直到遇到一个yield或者return语句。

yield语句意味着应该生成一个值,return语句意味着生成器要停止执行。

生成器由两部分组成:生成器的函数和生成器的迭代器。生成器的函数是用def语句定义的,包含yield的部分。生成器的迭代器是这个函数返回的部分。

生成器的方法

外部作用域访问生成器的send方法

内部则挂器生成器,yield作为表达式而不是语句使用。即当生成器重新运行时,yield返回一个值,通过send从外部世界发送的值。如果使用的是next,yield将返回一个None

>>> def repeater(value):

        while True:

            new = (yield value)

            if new is not None:

                value = new

>>> r=repeater(42)

>>> r.next()

42

>>> r.send("Hello, world! ")

'Hello, world! '

python魔法方法、构造函数、序列与映射、迭代器、生成器的更多相关文章

  1. python魔法方法-自定义序列

    自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python ...

  2. python魔法方法-自定义序列详解

    自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python ...

  3. 1. Python 魔法方法

    Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...

  4. Python魔法方法总结及注意事项

    1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...

  5. python魔法方法:__getattr__,__setattr__,__getattribute__

    python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...

  6. python魔法方法大全

    1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...

  7. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...

  8. with上下文管理 python魔法方法

    with语法在Python里很常见, 主要的利好是使用代码更简洁. 常见的使用场景有: 1. 资源对象的获取与释放. 使用with可以简化try...finally ... 2. 在不修改函数代码的前 ...

  9. python 魔法方法诠释

    什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...

随机推荐

  1. python 爬虫爬取内容时, \xa0 、 \u3000 的含义

    最近用 scrapy 爬某网站,发现拿到的内容里面含有 \xa0 . \u3000 这样的字符,起初还以为是编码不对,搜了一下才知道是见识太少 233 . \xa0 是不间断空白符   我们通常所用的 ...

  2. Xcode常用的文件路径

    1.Provisioning Profile文件在哪找? ~/Library/MobileDevice/Provisioning Profiles 2.master 在那找? ~/.cocoapods

  3. Spinner的简单使用

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  4. 【最新】Android使用jenkins全自动构建打包-Windows版本(Android,Jenkins,360加固,Email,QRcode,参数构建,蒲公英)

    Android打包喝咖啡系列(Windows版) 这篇博客主要讲述的内容: 1.windows上部署Jenkins https://jenkins.io 2.基于SVN或Git https://git ...

  5. git上传中的排除的配置文件, git实际的操作代码;

    git上传中的排除的配置文件: git实际的操作 在主目录建立.gitignore文件并输入以下保存: *.class #package file *.war *.ear #kdiff3 ignore ...

  6. ubuntu 安装PG10 更新packet 创建超级账号

    ubuntu 安装PG10 更新packet 创建超级账号 安装pg10 我的环境是16.04 server版本 MAC和windows 建议使用安装包 直接官网下载 echo 'deb http:/ ...

  7. Visual Studio Team Services Demo Generator简介

    Visual Studio Team Services Demo Generator简介 Visual Studio Team Services Demo Generator能够帮助我们在Visual ...

  8. SQL SERVER 查询哪些存储使用了该表

    SELECT obj.Name 存储过程名, sc.TEXT 存储过程内容 FROM syscomments sc INNER JOIN sysobjects obj ON sc.Id = obj.I ...

  9. PowerDesigner 16.5 使用VBScript脚本从Excel导入物理数据模型

    本文使用的数据库类型是Oracle 11g 最近在工作中遇到一个问题:数据的设计以表格的形式保存在Excel文件中.(由于保密原因,我只能看到数据库设计文档,无法访问数据库.=_=!) 其中包括Nam ...

  10. 表单取消历史保存之autocomplete的用法

    表单取消历史保存之autocomplete的用法 应用场景 浏览器开启了表单自动填充设置后,有些表单中的input元素在添加时会以下拉的形式显示以前填写过的表单,有时候可能会影响用户的使用.比如:da ...