魔术方法

2020-06-30  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读