魔术方法
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