Python的双下划方法
Posted wang-kai-1994
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的双下划方法相关的知识,希望对你有一定的参考价值。
一元运算符 __neg__ -、__pos__ +、__abs__ abs() 众多比较运算符 __lt__ <、__le__ <=、__eq__ ==、__ne__ !=、__gt__ >、__ge__ >= 算术运算符 __add__ +、__sub__ -、__mul__ *、__truediv__ /、__floordiv__ //、__ mod__ 、 __divmod__ divmod()、__pow__ ** 或 pow()、__round__ round() 反向算术运算符 __radd__、__rsub__、__rmul__、__rtruediv__、__rfloordiv__、__rmod__、 __rdivmod__、__rpow__ 增量赋值算术运算符 __iadd__、__isub__、__imul__、__itruediv__、__ifloordiv__、__imod__、 __ipow__ 位运算符 __invert__ ~、__lshift__ <<、__rshift__ >>、__and__ &、__or__ |、__ xor__ ^ 反向位运算符 __invert__ ~、__lshift__ <<、__rshift__ >>、__and__ &、__or__ |、__ xor__ ^ 增量赋值位运算符 __ilshift__、__irshift__、__iand__、__ixor__、__ior_
非
字符串 / 字节序列 表示形式 __repr__、__str__、__format__、__bytes__ 数值转换 __abs__、__bool__、__complex__、__int__、__float__、__hash__、__index__ 集合模拟 __len__、__getitem__、__setitem__、__delitem__、__contains__ 迭代枚举 __iter__、__reversed__、__next__ 可调用模拟 __call__ 上下文管理 __enter__、__exit__ 实例创建和销毁 __new__、__init__、__del__ 属性管理 __getattr__、__getattribute__、__setattr__、__delattr__、__dir__ 属性描述符 __get__、__set__、__delete__ 跟类相关的服务 __prepare__、__instancecheck__、__subclasscheck__
_repr__ 所返回的字符串应该准确、无歧义,并且尽可能表达出如何用代码创建出这个被 打印的对象。因此这里使用了类似调用对象构造器的表达形式(比如Vector(3, 4)就是个 例子)。 __repr__ 和 __str__ 的区别在于,后者是在 str() 函数被使用,或是在用 print 函数打印 一个对象的时候才被调用的,并且它返回的字符串对终端用户更友好。
__del__ 与 弱引用
del 不会删除对象,而是删除对象的引用。执行 del 操作后可能会导致对象不可获取,从而被垃圾回收机制删除。 Python 没有直接销毁对象的机制,CPython 中的垃圾回收主要依靠引用计数,后来实现了分代垃圾回收程序,它能把引用循环中不可获取的对象销毁。
弱引用不会增加对象的引用数量。不会妨碍所指对象被当作垃圾回收。
(WeakValueDictionary 类 实现的是一种可变映射,里面的值是对象的弱引用。被引用的对象在程序中的其他地方被当作垃圾回收后,对应的键会自动从 WeakValueDictionary 中删除。因此,WeakValueDictionary 经常用于缓存)
弱引用的局限
不是每个 Python 对象都可以作为弱引用的目标(或称所指对象)。基本的 list 和 dict 实 例不能作为所指对象,但是它们的子类可以轻松地解决这个问题.
但是,int 和 tuple 实例不能作为弱引用的目标,甚至它们的子类也不行。这些局限基本上是 CPython 的实现细节,在其他 Python 解释器中情况可能不一样。
class X: __slots__ = (‘a‘,‘b‘) def __init__(self,a): self.a = a
主要作用是为了创建海量数据时,提升效率,对于非指定的对象,不开辟内存空间。
对 slots 的修改并不会影响类创建时设定的内存分配策略。
总之,如果使用得当,slots 能显著节省内存,不过有几点要注意。
-
每个子类都要定义 slots 属性,因为解释器会忽略继承的 slots 属性。
-
实例只能拥有 slots 中列出的属性,除非把 ‘dict‘ 加入 slots 中(这样做
就失去了节省内存的功效)。
-
如果不把 ‘weakref‘ 加入 slots,实例就不能作为弱引用的目标。
-
__cal__
单例 class My(type): obj = None def __call__(self, *args, **kwargs): if not My.obj: obj = object.__new__(self) self.__init__(obj, *args, **kwargs) My.obj = obj return My.obj class Printer(metaclass=My):
装饰器 from functools import wraps class decorate: def __init__(self, name): self.name = name def __call__(self, func): @wraps(func) def deco(*args, **kwargs): if self.name == ‘Admin‘: pass elif self.name == ‘Student‘: pass) elif self.name == ‘Teacher‘: pass return func(*args, **kwargs) return deco @decorate(‘Admin‘) @decorate(‘Student‘) @decorate(‘Teacher‘)
以上是关于Python的双下划方法的主要内容,如果未能解决你的问题,请参考以下文章