本帖最后由 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)
|