首页 > 其他分享 >什么时候使用魔术方法,什么时候使用元类,什么时候使用描述符,什么时候使用装饰器, 什么时候使用functools模块应用装饰器

什么时候使用魔术方法,什么时候使用元类,什么时候使用描述符,什么时候使用装饰器, 什么时候使用functools模块应用装饰器

时间:2023-07-29 10:34:48浏览次数:36  
标签:__ 函数 什么 self 原函数 使用 时候 装饰

当你需要在类的实例化、属性访问或方法调用等特定时机执行特定的操作时,可以使用魔术方法。例如,假设你正在编写一个表示矩形的类,并希望在创建矩形对象时自动计算其面积。你可以使用__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

相关文章

  • vue使用directives V-指令限制输入框内容
    在一些表单中输入框需要前端加入限制,比如需要用户输入的是非负数的整数,这时候我们可以使用v-指令只要在input里加上就行。不需要一个个的去校验,省去的校验的代码<el-input-numberv-model="typeModel.jyCheckNum"clearableplaceholder="请输入不合格数"size="small"v-ente......
  • 设计模式-中介者模式在Java中使用示例-客户信息管理
    场景欲开发客户信息管理窗口界面,界面组件之间存在较为复杂的交互关系:如果删除一个客户,要在客户列表(List)中删掉对应的项,客户选择组合框(ComboBox)中客户名称也将减少一个;如果增加一个客户信息,客户列表中需增加一个客户,且组合框中也将增加一项。中介者模式概述如果在一个系统......
  • 叶绿素含量测定仪SPAD-502怎么使用?
      本文介绍基于SPAD-502叶绿素仪测定植被叶片叶绿素含量的方法。  SPAD-502是由日本柯尼卡美能达(KonicaMinolta)株式会社生产的轻便、手持式叶绿素仪,可以在不破坏作物的情况下快速测量植被叶片中的叶绿素含量。本文就详细介绍基于这一便携式叶绿素仪进行植被叶片叶绿素含量的......
  • C#计算代码运行时间(Stopwatch的使用)
    一、什么是StopwatchStopwatch:提供一组方法和属性,可以准确的测量运行时间。使用的时候需要引用命名空间:System.Diagnostics。 二、Stopwatch的简单使用//创建Stopwatch实例Stopwatchsw=newStopwatch();//开始计时sw.Start();for(inti=0;i<100;i++){Cons......
  • odoo _register_hook和_patch_methods组合使用,实现日志功能,效果和java的切面类似
    _register_hook方法是在odoo启动,加载模块时调用,可以在调用期间对某个的模型进行功能增强,比如增加日志下面是一个简单的示例:classLog(models.Model):_name="cn.com.brandmax.log"_description="日志"def_make_read(self):defread(self,fields=N......
  • 2020 某高校学生使用手机的目的调查。
    Asisapparentlydemonstratedinthechartabove,weareinformedsomeinformationconcerningcollegestudents"readingintentionswithmobilephonesinacertainuniversity.Tobemorespecific,withthehelpofcellphones,theproportionsofcolle......
  • 什么是FL Studio水果音乐制作软件,fl studio怎么设置中文语言切换详细操作
    如今,越来越多的音乐人选择使用音乐制作软件来进行音乐的创作,一台电脑、一款软件以及一个外接MIDI就是一个小型的音乐工作站。FLStudio成了音乐界萌新的首选,目前最新的版本为FLStudio21.0.3.3517版本。FLStudio21.0.3.35171是一款功能十分强大的音乐制作软件,可以让你的电脑变成小......
  • idea的基本使用
    1、创建maven项目2、配置pom.xml主要配置servlet和jsp<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependen......
  • 使用netapp实现内网穿透
    https://www.jianshu.com/p/68ea2c53858f 1.https://natapp.cn/     https://natapp.cn/article/natapp_newbie......
  • 使用RecyclerView来实现多层级的数据
    ✍️作者简介:沫小北(专注于Android、Web、TCP/IP等技术方向)......