第四部分 面向对象
- 对象和变量
- ==和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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复