Python面向对象编程——类(二)

微信公众号:数据分析与统计学习
最近更新时间:2018-7-1

一、前言

Python的系列文章主要介绍python语言的基础语法知识。按照核心内建数据类型、语句、函数、类、异常、标准模块的顺序对相关的语法知识进行讲解。
python类知识的介绍主要分为两块:第一部分讲解类的基础知识,类的定义、类与实例、如何创建一个类;第二部分详细介绍类的运算符重载,类装饰器。
上期小编介绍了类的基础知识,本期小编介绍类的运算符重载和类装饰器。

二、运算符重载

用于所有的类型方法

1、__init__ (self,[, arg]*)构造函数,该方法在Class(args)上被调用,用来初始化实例X= Class(args)。

2、__getattr__(self,name)和__setattr__(self,name,value)属性引用赋值
当name是一个未定义的属性入口时,在self.name上调用该方法。如果name已经存在或由self继承是,该方法不能被调用。
__setatrr__在self.name=value(所有属性赋值)上被调用。为避免递归循环,对属性字典做索引运算来赋值任何实例属性self__dict__[‘attr’]=value

3、__repr__(self)和__str__(self) 返回字符串表达形式
__repr__返回一个“作为代码”的字符串表示。定义了该方法,不管在终端用户(打印出对象print(x))显示还是交互模式下x,都不会显示对象的内存地址代码表示,而是显示一个“作为代码”的字符串。
__str__返回一个“用户友好”的字符串表示。定义了该方法,只在终端用户(打印出对象print(x))不会显示对象的一串内存地址代码表示,在交互模式下,则是显示一串内存地址代码。
4、__call__(self [, arg]*)函数调用
当像函数一样调用一个实例时,该方法在self(args…)上被调用。或者说,如果类定义了该方法,Python就会为实例在应用函数调用表达式时自动运行__call__方法。
事件处理器保存事件间的状态有两种方法:一种注册类的方法,一种遵循所需接口的实(使用__call__方法)。
绑定方法:方法也是一种对象,可以赋值、传递给函数、存储在数据结构等。类方法可以从一个实例或者一个类访问。所以绑定放有两种形式:
1、无绑定类方法对象:无self。直接通过对类进行点号运算获取类的函数属性,会返回无绑定(unbound)方法对象。可以像函数一样调用
2、绑定实例方法对象:有self+函数对。通过对实例进行点号运算获取类的函数属性,会返回绑定(bound)方法对象。Python在绑定方法对象中自动把实例和函数打包,所以不用传递实例调用该方法。可以像函数一样调用

用于集合的方法(序列对象和字典(映射))
1、__getitem__(self,key)和__setitem__(self,key,value) 索引和分片
实例进行索引访问和分片访问时,会自动调用方法__getitem__,例如字典和列表
实例进行索引赋值和分片赋值时,会自动调用方法__setitem__,例如字典和列表
__getitem__还具有一个迭代功能——索引迭代,如果类没有__iter__迭代器时,当for语句等迭代工具作用于支持该方法的实例时,for循环等迭代工具都会调用类的方法__getitem__。
2、__iter__(self)和__next__ (self)迭代器
在iter(self)中进行调用。for语句等迭代工具通过调用内置函数iter寻找__iter__方法并返还一个迭代器对象,然后重复调用迭代器的__next__方法。
在定义该方法时,需要注意迭代器只循环一次,循环之后,迭代器对象变为空。为了能够支持多个迭代器对象,必须每次迭代的时候创建新的迭代器对象。
3、__contains__(self,item)、__iter__和__getitem__ 成员关系
在self的item上进行调用来检测成员关系。在迭代领域,类通常把in成员关系运算符实现为一个迭代,如果没有方法__contains__,先使用__iter__,没有使用__getitem__方法

三、类装饰器

1def decoratoraClass):
2    pass
3
4decorator
5class Person(object):
6    pass

类装饰器和函数装饰器类似,类对象作为一个参数,传递给一个类,然后返回一个类对象,并将返回值赋值给被装饰的类对象名。上面调用等价于下面的格式

1def decoratoraClass):
2    pass
3
4class Person(object):
5    pass
6
7Person= decorator(Person)

四、类的陷进

类属于可变对象,当给类中的变量(属性)进行赋值时,并且进行原处修改,同时意味着修改类或实例对象,也会影响对它的多出引用。
如果实例对类中的全局变量进行赋值,会影响到所有实例对该属性的引用。
如果实例对类中的方法中的变量进行赋值,不会影响到其他实例对该方法中的变量的引用。
明白这一点,需要了解类中的命名空间规律(类、方法以及嵌套作用域)以及属性继承规则。

五、后记

写到这里,本期内容讲解完了,不知道读者的你有什么不明白的地方,欢迎各位留言反馈。小编尽最大的努力让理解我所介绍的内容。
下期,小编继续介绍python的异常。敬请期待。。。。。。


下面的是我的公众号二维码图片,欢迎关注我。


版权声明:本文为lxl20100102原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。