python 面向对象 特点
-
和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。
-
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
-
对象可以包含任意数量和类型的数据。
python 魔术方法/特殊方法/专有方法
python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法。这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能
-
类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用
-
super() 函数是用于调用父类(超类)的一个方法。
-
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。
-
运算重载 __add__: 加运算 __sub__: 减运算__mul__: 乘运算__truediv__: 除运算__mod__: 求余运算__pow__: 乘方 。。。
看到一个比较详细的总结
https://zhuanlan.zhihu.com/p/31161355
简单功能
这部分包括上面列出的前两个点
不需要修改直接调用的,主要有如下几个
- __dict__ 类和实例都可以调用这个方法
- 类调用返回这个类中已经定义了的属性和方法,包括特殊方法
- 实例调用返回属性的字典
- __module__ 类和实例都可以调用,类所在的模块,比如aa文件夹下的bb.py文件中则返回 aa.bb
- __class__ 只有实例可以调用,表明实例属于哪个类,内容包括了__module__的信息
- dir()函数 作用于类和实例上,返回它所有的属性和方法,实际上相当于调用了__dir__()函数
一般进行简单定义之后使用的方法
- __doc__ 返回定义类时标注的字符串,标注位置必须在定义的方法属性之前,默认是None
- __slots__ = ('name', 'age') 加一句这个可以只允许定义这两个属性,无法在实例中添加,这条命令只对当前类起作用,对子类无效
- __init__ 用于定义实例属性
- __call__ 输入 实例() 或者 类()() 触发,只有定义了这个,实例才可以像函数一样后面加括号
- __str__ print实例时打印出来的内容,不定义可以调用,重新定义后则可以定制打印内容
- __repr__ 直接输出实例名打印出来的内容,不定义可以调用,重新定义后则可以定制打印内容
- __new__ 创建实例时自动调用 __del__ 对象在内存中被释放时触发(后面不设置例子)
- __len__ 定义 len(实例) 返回的内容,比如字符串类就定义的是字符串的字符个数,当然也可以改成其他的
- __eq__ 改变==运算符的行为,定义实例使用==number时,是拿实例的什么与number相比
- 和eq类似的还有ne lt le gt ge
- 还有一些用于实例之间数值计算的 __add__ __abs__等方法,定义方式和__eq__差不多,这些应用的典型类就是数值类,定义这些其实定义了某些运算符的行为,比如__iadd__定义了+=的行为一样。除此之外还有转化为整数、浮点,
- __getattr__ 当实例访问的属性未被定义时,原来会报错,定义了这个之后就会按照这里定义的来输出. setattr 则可以设置属性 delattr则删除属性
可迭代对象
使实例成为可迭代对象(可以被for循环的)
- 实现 __iter__ __next__ 方法
- 如果只实现__iter__则这个方法的返回值必须是一个迭代器
- 也可以__iter__返回一个self,再定义__next__方法,接受self为参数,在里面具体实现如何取得下一个值以及迭代器何时结束
- 原理是当对实例调用for循环时,相当于每次对__iter__的返回结果作用一次next()函数,所以要想迭代必须定义__iter__方法。第一种就是next每次正常调用__iter__返回的值,这就要求它的返回值是一个迭代器;第二种则是把next函数改掉,使其功能不再是找到下一个,而是定制我们想要的一些操作
上下文管理
实现上下文管理,即可以和with结合使用
- 要实现 __enter__ __exit__ 两个方法
- __enter__会返回一个值,并赋值给as关键词之后的变量
- __exit__ 定义了处理结束后要做的事情,比如文件的关闭,socket的断开等
- 更深入地使用:__exit__中可以处理异常。
- 在上下文管理中运行的代码如果报错,会将三个值自动传入__exit__方法中,分别为 异常的类型,异常的值,异常的追踪栈
- 通过定义__exit__的返回值可以进行不同的处理,共有两种返回形式,返回True则这个异常忽略,返回None则正常抛出异常