当你需要在类的实例化、属性访问或方法调用等特定时机执行特定的操作时,可以使用魔术方法。例如,假设你正在编写一个表示矩形的类,并希望在创建矩形对象时自动计算其面积。你可以使用__init__
魔术方法来初始化矩形的属性,并在其中计算面积。
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
self.area = self.width * self.height
rect = Rectangle(5, 10)
print(rect.area) # 输出:50
当你需要动态地创建类或修改类的行为时,可以使用元类。例如,假设你想要创建一个元类,用于自动给所有的子类添加一个created_by
属性,记录创建该子类的模块名。你可以定义一个元类,并在其中使用__init__
方法来修改子类的行为。
class MetaClass(type):
def __init__(cls, name, bases, attrs):
attrs['created_by'] = __name__
super().__init__(name, bases, attrs)
class MyClass(metaclass=MetaClass):
pass
print(MyClass.created_by) # 输出:__main__
当你需要对类的属性进行控制或实现特定的访问逻辑时,可以使用描述符。例如,假设你正在编写一个类,表示一个温度对象,并希望确保温度值始终在一定范围内。你可以定义一个描述符类,并在其中实现__get__
和__set__
方法来控制对温度属性的访问和修改。
class TemperatureDescriptor:
def __get__(self, instance, owner):
return instance._temperature
def __set__(self, instance, value):
if value < -273.15:
raise ValueError("Temperature cannot be below absolute zero.")
instance._temperature = value
class Temperature:
temperature = TemperatureDescriptor()
temp = Temperature()
temp.temperature = 25
print(temp.temperature) # 输出:25
temp.temperature = -300 # 抛出异常:ValueError: Temperature cannot be below absolute zero.
当你想要在不修改原函数代码的情况下,为函数添加额外的功能或行为时,可以使用装饰器。例如,假设你正在编写一个日志记录器,希望记录每次调用函数时的参数和返回值。你可以定义一个装饰器函数,并在其中调用原函数,并在调用前后记录日志。
def logger(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"Calling function {func.__name__} with args: {args}, kwargs: {kwargs}")
result = func(*args, **kwargs)
print(f"Function {func.__name__} returned: {result}")
return result
return wrapper
@logger
def add(a, b):
return a + b
result = add(5, 10) # 输出:Calling function add with args: (5, 10), kwargs: {}, Function add returned: 15
print(result) # 输出:15
functools
模块提供了一些有用的函数,其中包括wraps
装饰器。当你编写装饰器时,使用wraps
装饰器可以帮助保留原函数的元数据,例如函数名、文档字符串等。这样可以避免在装饰器中丢失原函数的信息。因此,当你编写装饰器时,可以使用functools.wraps
来应用装饰器并保留原函数的元数据。
当你需要在类的实例化、属性访问或方法调用等特定时机执行特定的操作时,可以使用魔术方法。例如,`__init__`方法在实例化对象时被调用,`__str__`方法在使用`print`函数打印对象时被调用。
当你需要动态地创建类或修改类的行为时,可以使用元类。元类允许你在类定义阶段对类进行操作,例如添加属性、方法或修改继承关系。
当你需要对类的属性进行控制或实现特定的访问逻辑时,可以使用描述符。描述符是一个定义了`__get__`、`__set__`和`__delete__`方法的类,它可以被其他类的属性引用,从而控制属性的访问和修改。
当你想要在不修改原函数代码的情况下,为函数添加额外的功能或行为时,可以使用装饰器。装饰器是一个函数,它接受一个函数作为参数,并返回一个新的函数,新函数可以在调用原函数之前或之后执行额外的操作。
`functools`模块提供了一些有用的函数,其中包括`wraps`装饰器。当你编写装饰器时,使用`wraps`装饰器可以帮助保留原函数的元数据,例如函数名、文档字符串等。这样可以避免在装饰器中丢失原函数的信息。因此,当你编写装饰器时,可以使用`functools.wraps`来应用装饰器并保留原函数的元数据。
标签:__,函数,什么,self,原函数,使用,时候,装饰 From: https://blog.51cto.com/u_16055028/6890724