美文网首页
魔术方法

魔术方法

作者: 蝉时雨丶 | 来源:发表于2020-06-30 16:18 被阅读0次

    call方法

    call():可以让类的实例具有类似于函数的行为,
    进一步模糊了函数和对象之间的概念。
    使用方式:对象后面加括号,触发执行。即:对象() 或者 类()()

    class Person(object):
    
        def __call__(self, *args, **kwargs):
            print('call...')
    
    person = Person()  # 将Person()的内存地址赋值给person
    person()  # 内存地址()
    #或者是Person()()
    

    结果:

    call...
    

    new方法

    实例化魔术方法
    触发时机: 在实例化对时触发
    参数:至少一个cls接收当前类
    返回值:必须返回一个对象实例
    作用:实例化对象
    注意:实例化对象是Object类底层实现,其他类继承了Object的new才能够实现实例化对象。
    没事别碰这个魔术方法,先触发new才会触发init

    class Person(object):
    
        # 初始化
        def __init__(self):
            print('init...')
    
        # 实例化方法(构造方法)---》创建对象
        def __new__(cls, *args, **kwargs):
            print('new...')
            ret = super().__new__(cls) # 调用父类的__new__()方法创建对象,并用接收返回值
            return ret # 将对象返回给person
    
    
    person = Person()
    print(person)
    

    输出为:

    new...
    init...
    <__main__.Person object at 0x00000000021CC860>
    

    如上代码所示,要先创建一个对象,才能初始化,所以输出是先输出new…,才输出init…

    str方法

    触发时机:使用print(对象)或者str(对象)的时候触发
    参数:一个self接收对象
    返回值:必须是字符串类型
    作用:print(对象时)进行操作,得到字符串,通常用于快捷操作

    class Cat(object):
        def __str__(self):
            return '这是一只猫'
    
    cat=Cat()
    print(cat)
    

    输出:

    这是一只猫
    

    在python中 使用print()函数输出对象名称的时候默认情况下,会打印
    对象名引用的内存地址,如果希望打印对象的属性值,可以使用str(self)
    这个方法。
    ————————————————
    版权声明:本文为CSDN博主「李嘉豪554」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_44251004/java/article/details/86503238

    code

    简单总结几个常用的code的用法:

    (1)func.code.co_argcount:返回函数的参数个数,这里的参数个数不包含args与kwargs,具体来讲就是args前的参数。

    def a(a,b,c,d=2,e=3,arg,f,g=8,*kwargs):
    print(a,b,c,d,arg,f,g,kwargs)
    a.code.co_argcount
    5
    这里的5个就是a,b,c,d,e

    (2)func.code.co_kwonlyargcount:返回函数强制关键字参数个数,也就是args后面的参数个数,这里参数个数也不包含args和**kwargs。

    a.code.co_kwonlyargcount
    2
    这里两个就是f,g。

    (3)func.code.co_cellvars和func.code.co_freevars是对闭包函数而言的。

    func.code.co_cellvars:返回外部函数中被内嵌函数调用的参数,这里注意,一定是被调用的。

    func.code.co_freevars:返回内部函数中引用外部函数参数。

    def f(a,b):
    c=2
    def g():
    e=c
    return g
    print(f.code.co_consts[2].co_freevars)
    ('c',)
    这里co_consts是外部函数f的常量有2,和g。

    print(f.code.co_cellvars)
    ('c',)
    4.code.co_varnames:将函数局部变量以元组的形式返回。

    f.code.co_varnames
    ('a', 'b', 'g')
    def test(a,b,c,d=1,e=2,args,f=3,g,h=4,*kwargs):
    print(a,b,c,d,e,f,g,h,args,kwargs)
    test.code.co_varnames
    ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'args', 'kwargs')

    getattr

    getattr函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过dict)失败, 那么会调用到类的getattr函数, 如果没有定义这个函数,那么抛出AttributeError异常。由此可见,getattr一定是作用于属性查找的最后一步,兜底。

    class ObjectDict(dict):
    def init(self, *args, *kwargs):
    super(ObjectDict, self).init(
    args, **kwargs)

    def __getattr__(self, name):
        value =  self[name]
        if isinstance(value, dict):
            value = ObjectDict(value)
        return value
    

    if name == 'main':
    od = ObjectDict(asf={'a': 1}, d=True)
    print od.asf
    print od.asf.a
    print od.d

    相关文章

      网友评论

          本文标题:魔术方法

          本文链接:https://www.haomeiwen.com/subject/kjpxqktx.html