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

构造函数

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

创建一个构造方法

构造方法传参

>>> classFooBar: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参数是自动被绑定到类的。

classMyClass:defsmeth():print('This is a static method')

smeth=staticmethod(smeth)defcmeth(cls):print('This is a class method of', cls)

cmeth= classmethod(cmeth)

装饰器:使用@操作符

>>> classMyClass:

@staticmethoddefsmeth():print('This is a static method')

@classmethoddefcmeth(cls):print('This is a class method of',cls)>>> MyClass.smeth() #静态方法:定义没有self参数,并且能够被类本身直接调用

Thisisa static method>>>MyClass.cmeth()

Thisis a class method of

__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构造方法显示地将迭代器转化为列表

>>> classTestIterator:

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

self.value+=1

if self.value >10:raiseStopIterationreturnself.valuedef __iter__(self):returnself>>> 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

>>> defrepeater(value):whileTrue:

new= (yieldvalue)if new is notNone:

value=new>>> r=repeater(42)>>>r.next()42

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

python魔法函数和装饰器_python魔法方法、构造函数、序列与映射、迭代器、生成器...相关推荐

  1. python中高阶函数和装饰器_Python高阶函数与装饰器函数的深入讲解

    本文主要介绍的是Python高阶函数与装饰器函数的相关内容,分享给大家,下面话不多说了,来一起看看详细的介绍吧 高阶函数 1.可以使用函数对象作为参数的函数 2.或可以将函数作为返回值的函数 3.函数 ...

  2. python内置哪些装饰器_Python内置的wraps装饰器有什么用

    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...

  3. python之函数三装饰器

    装饰器形成的过程 装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后加功能 原则:开发封闭原则 开发:对扩展是开发的 封闭:对修改是封闭的 装饰器的固定模式 计算运行时间 1 import ...

  4. python高阶函数闭包装饰器_Python自学从入门到就业之高阶函数、嵌套函数、闭包、装饰器...

    高阶函数 在Python中,函数其实也是一种数据类型. def test(): return 'hello world' print(type(test)) # 函数对应的数据类型是 function ...

  5. python 二——函数、装饰器、生成器、面向对象编程(初级)

    本节内容 1.函数 2.装饰器 3.生成器 4.类 一.函数 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强... ...

  6. python基础-函数之装饰器、迭代器与生成器

    1. 函数嵌套 1.1 函数嵌套调用 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数 def bar():print("from in the bar.")def foo ...

  7. what's the python之函数及装饰器

    what's the 函数? 函数的定义:(return是返回值,可以没有,不过没有的话就返回了None) def wrapper(参数1,参数2,*args,默认参数,**kwargs):'''注释 ...

  8. python 函数装饰器_python函数装饰器的用法

    函数装饰器: 开闭原则:在面向对象编程领域中,开闭原则规定"软件中的对象(类,模块,函数等等)应该对于扩展是开放的, 但是对于修改是封闭的",这意味着一个实体是允许在不改变它的源代 ...

  9. python 运行时间 装饰器_python 装饰器统计某个函数的运行时间

    import datetime def count_time(func): def int_time(*args, **kwargs): start_time = datetime.datetime. ...

最新文章

  1. 终于找到一个还算满意的blog来安家了
  2. 计算机c盘属性不显示安全选项,win7系统中文件夹属性安全选项卡空白的解决方法...
  3. haproxy负载均衡_做负载均衡Nginx、HAProxy和LVS总有一个适合你
  4. 基于IOC的GUI框架设计与实现
  5. 知道你用linux可视文件系统为什么搜索不到文件吗?(隐藏文件夹搜不到!!要用find . -name “xxx“命令)
  6. 自定义Flume拦截器,并将收集的日志存储到Kafka中(案例)
  7. 打印机打印网页不清晰_针式打印机不开机故障维修
  8. tableview,基本属性图片详细解释
  9. java连接imserver_java后端IM消息推送服务开发——协议
  10. 正确绑定键盘事件_事件为何重要以及如何正确处理
  11. java策略模式详解_Java经典设计模式之策略模式原理与用法详解
  12. 完美解决wordpress邮件链接无效的问题
  13. 循环冗余检错码CRC
  14. 38. 重定向与负载均衡
  15. Mysql跨表更新 多表update sql语句总结
  16. 这10个idea小技巧,让我的开发效率提升了10倍
  17. 请问mac上下virtualBox之后无法安装VBoxGuestAdditions怎么办??
  18. Go语言 常用日志记录方法
  19. 沁园春·长沙 中法对照
  20. android开发发送短信,Android开发入门之发送短信

热门文章

  1. 剑指Offer - 面试题32 - III. 从上到下打印二叉树 III(BFS,queue+stack)
  2. NumPy快速入门--基础知识
  3. 最小二乘估计_相关性及最小二乘估计【20201026】
  4. html设置div页面最底,使用css让大图片不超过网页宽度
  5. rds for mysql的监控指标_mysql(RDS)常用性能指标监控
  6. 【机器学习】知识框图总结
  7. 直方图均衡 视觉显著_视觉图像:对比度受限直方图均衡化CLAHE
  8. 人工智能大地图之分布式人工智能篇
  9. 深度剖析开源分布式监控CAT
  10. PaddlePaddle预训练模型大合集