在Python中,函数也是对象,可以像其他对象一样被打印。默认情况下,打印函数对象会显示其内存地址和一些基本信息。但我们可以通过自定义__repr__
或__str__
方法来改变函数对象的打印行为。
def printable_function(func):
"""装饰器,为函数添加自定义打印行为"""
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
# 自定义__repr__方法
def custom_repr():
return f"<函数 {func.__name__} at {hex(id(func))}>"
wrapper.__repr__ = custom_repr
wrapper.__str__ = custom_repr
wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__
return wrapper
@printable_function
def my_function():
"""这是一个示例函数"""
pass
print(my_function) # 输出: <函数 my_function at 0x...>
class PrintableFunction:
def __init__(self, func, custom_repr=None):
self.func = func
self.custom_repr = custom_repr or (lambda: f"<函数 {func.__name__}>")
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
def __repr__(self):
return self.custom_repr()
def __str__(self):
return self.custom_repr()
def greet(name):
print(f"Hello, {name}!")
# 创建自定义打印的函数对象
printable_greet = PrintableFunction(greet, lambda: "<友好的问候函数>")
print(printable_greet) # 输出: <友好的问候函数>
__repr__
属性def add(a, b):
return a + b
add.__repr__ = lambda: f"<加法函数>"
print(add) # 输出: <加法函数>
__repr__
或__str__
不会影响函数的功能def printable_with_info(info):
"""带参数的装饰器,可以自定义打印信息"""
def decorator(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
wrapper.__repr__ = lambda: f"<函数 {func.__name__}: {info}>"
wrapper.__str__ = wrapper.__repr__
return wrapper
return decorator
@printable_with_info("计算两个数的和")
def add(a, b):
return a + b
print(add) # 输出: <函数 add: 计算两个数的和>
通过以上方法,你可以灵活地控制Python函数对象的打印输出,使其更符合你的需求。
没有搜到相关的文章