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(expressionglobals=Nonelocals=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

posted @ 2019-02-12 17:09  taomin  阅读(140)  评论(0编辑  收藏  举报