|
发表于 2023-1-7 17:36:42
|
显示全部楼层
本帖最后由 Ensoleile 于 2023-1-10 00:30 编辑
__call__()、__str__()和__repr__()
- #__call__():在对象中既可以有属性又可以有方法,python可以像调用函数一样去调用一个对象,要求就是需要这个对象的类定义__call__()魔法方法
- class C:
- def __call__(self):
- print('hello')
- c = C()
- c()#hello
- class C:
- def __call__(self, *args, **kwargs):
- print(f'位置参数 -> {args}\n关键字参数 -> {kwargs}')
- c = C()
- c(1, 2, 3, x=250, y=520)
- # 位置参数 -> (1, 2, 3)
- # 关键字参数 -> {'x': 250, 'y': 520}
- #用__call__()函数实现闭包的效果
- class Power:
- def __init__(self, exp):
- self.exp = exp
- def __call__(self, base):
- return base ** self.exp
- square = Power(2)
- cube = Power(3)
- print(square(5))#25
- print(cube(3))#27
- #跟字符串相关的魔法方法:__str__()和__repr__() P168
- #__repr__()对应repr()函数,str()函数将参数转换为字符串对象,是给人看的;repr函数将对象转换为程序可执行的字符串,是给程序看的
- #repr()与eval()互被称为反函数,eval()作用为将参数去引号后执行,并且得到结果。repr()函数返回的字符串作为参数传递给eval()函数的话,那么所得到的结果必定是repr()函数的参数
- print(repr("print('crazy')"))#"print('crazy')"
- print(str("print('crazy')"))#print('crazy')
- #repr()返回的带引号,str()返回的不带引号
- eval("print('crazy')")#crazy
- eval(repr('crazy'))
- try:
- eval(str('crazy'))
- except NameError as e:
- print(e)#name 'crazy' is not defined
- #str('crazy')的返回值为crazy,不带引号,python会将其作为变量名来引用,结果就是找不到的定义fishc的变量
- #repr()返回的是带引号的'crazy',eval(repr('crazy'))会执行
- eval(repr("print('crazy')"))#不打印
- eval(repr(print('crazy')))#crazy
- eval(str("print('crazy')"))#crazy
- eval(str(print('crazy')))#crazy
- #代偿:__str__() -> __repr__(),repr代偿str,反过来不行
- class C:
- def __repr__(self):
- return 'i love you'
- c = C()
- print(repr(c))#i love you
- print(str(c))#i love you
- #__str__()魔法方法定义的,只能应用于对象出现在打印操作的顶层,即如果把多个对象放到一个列表中,然后打印该列表的话,那么就没办法访问到对应的字符串了
- cs = [C(), C(), C()]
- for each in cs:
- print(each)
- # i love you
- # i love you
- # i love you
- print(cs)
- #[i love you, i love you, i love you]
- #__repr__()可以访问到每个cs的元素
- class C:
- def __str__(self):
- return 'i love you'
- cs = [C(), C(), C()]
- print(cs)
- #[<__main__.C object at 0x000001699FF0AC70>, <__main__.C object at 0x000001699FF0AC40>, <__main__.C object at 0x000001699FF0ACD0>]
- class C:
- def __init__(self, data):
- self.data = data
- def __str__(self):
- return f'data = {self.data}'
- def __repr__(self):
- return f'C({self.data})'
- def __add__(self, other):
- self.data += other
- c = C(250)
- print(c)#data = 250
- print(repr(c))#C(250)
- c + 250
- print(c)#data = 500
- print(repr(c))#C(500)
复制代码 |
|