zoukankan      html  css  js  c++  java
  • 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__,__str__
    _repr__ 所返回的字符串应该准确、无歧义,并且尽可能表达出如何用代码创建出这个被 打印的对象。因此这里使用了类似调用对象构造器的表达形式(比如Vector(3, 4)就是个 例子)。
    
    __repr____str__ 的区别在于,后者是在 str() 函数被使用,或是在用 print 函数打印 一个对象的时候才被调用的,并且它返回的字符串对终端用户更友好。

    __del__ 与 弱引用

    del 不会删除对象,而是删除对象的引用。执行 del 操作后可能会导致对象不可获取,从而被垃圾回收机制删除。
    
    Python 没有直接销毁对象的机制,CPython 中的垃圾回收主要依靠引用计数,后来实现了分代垃圾回收程序,它能把引用循环中不可获取的对象销毁。

     弱引用不会增加对象的引用数量。不会妨碍所指对象被当作垃圾回收。
    
    (WeakValueDictionary 类 实现的是一种可变映射,里面的值是对象的弱引用。被引用的对象在程序中的其他地方被当作垃圾回收后,对应的键会自动从 WeakValueDictionary 中删除。因此,WeakValueDictionary 经常用于缓存)
      弱引用的局限

    不是每个 Python 对象都可以作为弱引用的目标(或称所指对象)。基本的 list 和 dict 实 例不能作为所指对象,但是它们的子类可以轻松地解决这个问题.

    但是,int 和 tuple 实例不能作为弱引用的目标,甚至它们的子类也不行。这些局限基本上是 CPython 的实现细节,在其他 Python 解释器中情况可能不一样。

     
    __slots__

    默认情况下,Python 在各个实例中名为 dict 的字典里存储实例属性。

    通过设置 slots ,阻止实例创建 dict 成员。解释器仅为指定成员分配内存空间

    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')
  • 相关阅读:
    (原)学习ORACLE 视图
    (原)学习ORCALE 表和约束
    下班前网上搜集的方法哈哈
    (传)Visual C# WinForm中DataGrid批量删除解决之道。
    (原)学习ORCALE索引
    用于图片切割,图片压缩,缩略图的生成(转到一个好东西)
    NET 2.0 WinForm Control DataGridView 编程36计(转)
    一些常用PLSQL语句 和事务
    温故知新的经典书评《Programming C# 》中文版第4版
    我最恐惧的事情是竞争力的丧失(转)
  • 原文地址:https://www.cnblogs.com/wang-kai-1994/p/10222115.html
Copyright © 2011-2022 走看看