概述
第四部分 面向对象
- 对象和变量
- ==和is, ==能够被重载(
__eq__()
),is不能。 - 浅复制:工厂函数, 切片, copy.copy。
深复制:copy.deepcopy - 引用传参(共享传参)。
- 注意可变参数作为默认值时,存在
method.__defaultes__
中。 - 对象引用计数归零时回收内存。通过del删除引用,或者变量重新赋值使原来对象失去引用。
__str___
和__repr___
, str找不到会去找repr。- https://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods 讲解了普通method、staticmethod、classmethod、abstractmethod
- staticmethod:没有用到self自身实例的方法,类似于普通顶级函数,但在类中,能够被子类使用或重写。
- classmethod:用于工厂方法,返回实例;可调用类静态方法且能够在子类中运行良好(在调用的方法中,类名用self替代,self.classmethod)。
__slots__
子类需要重新定义。- slice.indices()
__getattr__
只会在找不到属性时执行,实例属性->类属型->父类->`__getattr__
方法。`__setattr__
设置属性。- 散列值hash()。通过映射归约 map 获取各元素的散列值列表 -> reduce 聚合(xor)所有散列值。
- zip、zip_longest
- 协议? 容器协议
__contains__
迭代协议__iter__
- 运行时实现协议(如动态的给实例对象赋值
__getitem__
方法) - 抽象基类
@abstractmethod
放在最底层,与def间不能有任何其他装饰器。class A(abc.ABC): @classmethod @abc.abstractmethod def abstract_classmethod(cls): pass
- 虚拟子类在任何时候(导入和实例化)都不会检查是否符合抽象基类的接口,为了在运行时避免错误,需要实现所需的全部方法。
- 注册虚拟子类@cls.register或者cls.register(subclass)
- 继承内置类型会有很多麻烦(部分方法会跳过覆盖的方法,如dict的
__init__
、get()
、update()
),可以选择继承UserList,UserDict等 - 继承时,遵循方法解析顺序通过类属性
__mro__
或mro()查看。 - 利用cls.method(self)可以跳过mro,并指定想要的父类方法。
- 不能重载内置类型运算符,不能新建运算符,某些运算符不能重载(is、not、and、or)。
- +一元取正
__pos__
、-一元取负__neg__
、~按位取反__invert__
- +加法运算符
__add__
、*乘法运算符__mul__
- 比较运算符
- +=运算符
__iadd__
、*=运算符__imul__
。若不存在,a += b 实际就是 a = a + b - 不可变类型一定不能实现就地特殊方法
最后
以上就是高高路人为你收集整理的Fluent Python笔记二的全部内容,希望文章能够帮你解决Fluent Python笔记二所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复