zoukankan      html  css  js  c++  java
  • python内置函数和魔法函数

    内置方法:Python中声明每一个类系统都会加上一些默认内置方法,提供给系统调用该类的对象时使用。比如需要实例化一个对象时,需要调用该类的init方法;使用print去打印一个类时,其实调用的是str方法等等。

    • init(self, …):初始化对象class,在创建新对象时调用。在方法里,可以初始化该对象的属性,否则调用其他时可能出“现has no attribute”错误;
    • del(self):释放对象,在对象被虚拟机删除之前调用;
    • new(cls,*args,**kwd):实例的生成操作,相比init在对象实例化调用做初始化,new方法运行在实例化阶段,修改某些实例化过程;
    • str(self):在使用print语句时被调用,将对象的属性值拼接成字符串返回;
    • getitem(self, key):获取序列的索引key对应的值,需要使用[]操作符的类需要覆盖的,等价于seq[key];
    • setitem(self, key, value):类似geitem,需要seq[key]=value操作的类需要实现该方法;
    • len(self):在调用内联函数len()时被调用;
    • getattr(s, name): 获取属性的值;
    • setattr(s, name, value):设置属性的值;
    • delattr(s, name): 删除name属性;
    • getattribute():getattribute()功能与getattr()类似,无条件被调用,通过实例访问属性。如果class中定义了getattr(),则getattr()不会被调用(除非显示调用或引发AttributeError异常);
    • gt(self, other):判断self对象是否大于other对象;
    • lt(self, other):判断self对象是否小于other对象;
    • ge(slef, other):判断self对象是否大于或者等于other对象;
    • le(self, other): 判断self对象是否小于或者等于other对象;
    • eq(self, other):判断self对象是否等于other对象;
    • call(self, *args): 把实例对象作为函数调用,在一个对象后面加上(),虚拟机就会调用该call方法。

    内置变量:

    • name:标识模块的名字的一个系统变量。假如当前模块是主模块(也就是调用其他模块的模块),那么此模块名字就是”main“,通过if判断这样就可以执行“main”后面的主函数内容;假如此模块是被import的,则此模块名字为文件名字(不加后面的.py),通过if判断这样就会跳过“main”后面的内容;
    • file:用来获得模块所在的路径的,这可能得到的是一个相对路径;
    • package:当前文件为None,导入其他文件,指定文件所在包用 . 分割;
    • doc:文件注释

    python英文官方文档详细说明:点击查看

    魔法函数

    • Python进阶:实例讲解Python中的魔法函数(Magic Methods)

    • 定制类和魔法方法

    • python中以双下划线开始和结束的函数(不可自己定义)为魔法函数
    • 调用类实例化的对象的方法时自动调用魔法函数(感觉不需要显示调用的函数都叫)
    • 在自己定义的类中,可以实现之前的内置函数,比如下面比较元素sorted时用It函数(lt(self, other):判断self对象是否小于other对象;)
    class MyVector(object):
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
        def __add__(self, other_instance):
            re_vector = MyVector(self.x+other_instance.x, self.y+other_instance.y)
            return re_vector
    
        def __str__(self):
            return"x:{x}, y:{y}".format(x=self.x, y=self.y)
    
    
    first_vec = MyVector(1,2)
    second_vec = MyVector(2,3)
    print(first_vec+second_vec)

    操作符重载:通过定义类的一些约定的以"__"开头并结尾的函数,可以到达重载一些特定操作的目的

    __str__ / __unicode__       
    当print一个对象实例时,实际是print该实例 .str()函数的返回值:

    class A:
        def __str__(self):
            return "A"
        def __unicode__(self):
            return "uA"

    魔法函数有什么作用?

    魔法函数可以为你写的类增加一些额外功能,方便使用者理解。举个简单的例子,我们定义一个“人”的类People,当中有属性姓名name、年龄age。让你需要利用sorted函数对一个People的数组进行排序,排序规则是按照name和age同时排序,即name不同时比较name,相同时比较age。由于People类本身不具有比较功能,所以需要自定义,你可以这么定义People类:

    class People(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
            return
    
        def __str__(self):
            return self.name + ":" + str(self.age)
    
        def __lt__(self, other):
            return self.name < other.name if self.name != other.name else self.age < other.age
    
    
    
    
    if __name__=="__main__":
    
        print("	".join([str(item) for item in sorted([People("abc", 18), People("abe", 19), People("abe", 12), People("abc", 17)])]))
    • 上个例子中的__lt__函数即less than函数,即当比较两个People实例时自动调用。

    Python中有哪些魔法函数?

    Python中每个魔法函数都对应了一个Python内置函数或操作,比如__str__对应str函数,__lt__对应小于号<等。Python中的魔法函数可以大概分为以下几类:

    类的构造、删除:

    object.__new__(self, ...)
    object.__init__(self, ...)
    object.__del__(self)
    

    二元操作符:

    +	object.__add__(self, other)
    -	object.__sub__(self, other)
    *	object.__mul__(self, other)
    //	object.__floordiv__(self, other)
    /	object.__div__(self, other)
    %	object.__mod__(self, other)
    **	object.__pow__(self, other[, modulo])
    <<	object.__lshift__(self, other)
    >>	object.__rshift__(self, other)
    &	object.__and__(self, other)
    ^	object.__xor__(self, other)
    |	object.__or__(self, other)
    

    扩展二元操作符:

    +=	object.__iadd__(self, other)
    -=	object.__isub__(self, other)
    *=	object.__imul__(self, other)
    /=	object.__idiv__(self, other)
    //=	object.__ifloordiv__(self, other)
    %=	object.__imod__(self, other)
    **=	object.__ipow__(self, other[, modulo])
    <<=	object.__ilshift__(self, other)
    >>=	object.__irshift__(self, other)
    &=	object.__iand__(self, other)
    ^=	object.__ixor__(self, other)
    |=	object.__ior__(self, other)
    

    一元操作符:

    -	object.__neg__(self)
    +	object.__pos__(self)
    abs()	object.__abs__(self)
    ~	object.__invert__(self)
    complex()	object.__complex__(self)
    int()	object.__int__(self)
    long()	object.__long__(self)
    float()	object.__float__(self)
    oct()	object.__oct__(self)
    hex()	object.__hex__(self)
    round()	object.__round__(self, n)
    floor()	object__floor__(self)
    ceil()	object.__ceil__(self)
    trunc()	object.__trunc__(self)
    

    比较函数:

    <	object.__lt__(self, other)
    <=	object.__le__(self, other)
    ==	object.__eq__(self, other)
    !=	object.__ne__(self, other)
    >=	object.__ge__(self, other)
    >	object.__gt__(self, other)
    

    类的表示、输出:

    str()	object.__str__(self) 
    repr()	object.__repr__(self)
    len()	object.__len__(self)
    hash()	object.__hash__(self) 
    bool()	object.__nonzero__(self) 
    dir()	object.__dir__(self)
    sys.getsizeof()	object.__sizeof__(self)
    

    类容器:

    len()	object.__len__(self)
    self[key]	object.__getitem__(self, key)
    self[key] = value	object.__setitem__(self, key, value)
    del[key] object.__delitem__(self, key)
    iter()	object.__iter__(self)
    reversed()	object.__reversed__(self)
    in操作	object.__contains__(self, item)
    字典key不存在时	object.__missing__(self, key)
  • 相关阅读:
    MSSQL查询表占用空间
    JS字典
    匹配是否指定主域名
    站点文件删除不了提示权限不足
    事件委托发布-订阅
    微信中打开第三方应用
    以Spring Bean配置文件为例解释 xmlns,xmlns:xsi,xsi:schemaLocation
    Hdfs的读出机制
    Hdfs的写入机制
    spring常用注解的作用
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/9219110.html
Copyright © 2011-2022 走看看