python魔法方法
1.__call__
实现__call__后,该类的对象可以被调用
举例如:
class test_call_: def __init__(self, n): self.n = n def __call__(self, *args, **kwargs): print("print",self.n) self.n +=1 test_call_obj = test_call_(1) test_call_obj() test_call_obj()
test_call_obj是类的对象,test_call_实现了__call__后,可以被该类的对象可以被调用,调用后会打印self.n的值
2.__repr__和__str__
repr和str的功能类似,像java的tostring,在print的时候被调用
官网链接:https://docs.python.org/3/reference/datamodel.html?highlight=__str__#object.__repr__
官网上对于__str__的解释,会在format()和print()时被调用,返回值必须是string类型
对于__repr__的定义
注意点:
1.repr在官网上推荐使用为返回值是一个调试类的信息
2.如果类没有实现__str__时 __repr__也会被调用
3.当类的对象被封装到容器中时,会优先调用__repr__,而不是__str__,这个在python官网中有人已经提出来了
https://www.python.org/dev/peps/pep-3140/
针对第3点举例如下
class test_str: def __repr__(self): return "repr" def __str__(self): return "str" if __name__=="__main__": test_strObj = test_str() print([test_strObj])
打印结果为:[repr]
而实际上按照python的做法应该优先调用__str__
print调用__str__和__repr__方法实例
实例1
class test_str: def __repr__(self): return "repr" if __name__=="__main__": test_strObj = test_str() print(test_strObj)
结果是打印repr
实例2
class test_str: # def __repr__(self): # return "repr" def __str__(self): return "str" if __name__=="__main__": test_strObj = test_str() print(test_strObj)
结果是打印str
class test_str: def __repr__(self): return "repr" def __str__(self): return "str" if __name__=="__main__": test_strObj = test_str() print(test_strObj)
结果仍然是打印str,说明,如果存在__str__时会优先调用__str__方法
4.eval
该方法不是魔法方法
eval
(expression, globals=None, locals=None)
函数入参为string的表达式,eval会去执行这个字符串并得到返回值
subString = "w>2 and h>1" r = eval(subString.replace("w","3").replace("h","4")) print(r)
打印结果是True,表达式为"3>2 and 4>1",python执行后返回是True
print(eval('1+2'))
打印结果是3