当前位置: 首页 > 知识库问答 >
问题:

如何使用类装饰器包装器?

方弘
2023-03-14

我有一个data_class对象,希望使用装饰器添加一些功能。它可以工作,但是类名丢失,成为DefaultInstance. .subclass

我知道functools.wraps可以修复这个问题,但是应该在哪里/如何使用它呢?

from dataclasses import dataclass, fields, is_dataclass
   
def defaultinstance(object):
  
    class SubClass(object):
        @classmethod
        def woof(cls):
            print("woof")

    return SubClass


@defaultinstance
@dataclass
class Dog:
    name: str
    paws: int


doggo = Dog(name="jack", paws=4)

print(doggo)
# defaultinstance.<locals>.SubClass(name='jack', paws=4)

共有1个答案

胡博艺
2023-03-14

您可以让装饰器像这样修改类

from dataclasses import dataclass, fields, is_dataclass
   
def defaultinstance(object):
    """
    creates a class method 'woof' and adds it to object
    """
    @classmethod
    def woof(cls):
        print("woof")
    
    setattr(object, 'woof', woof)
    return object


@defaultinstance
@dataclass
class Dog:
    name: str
    paws: int


doggo = Dog(name="jack", paws=4)

print(doggo)

有结果

Dog(name='jack', paws=4)

这样,您就不必创建一个需要伪装成旧类的新类,而旧类从未被使用过。

 类似资料:
  • 问题内容: 考虑这个小例子: 哪个打印 为什么参数(应该是Test obj实例)没有作为第一个参数传递给装饰函数? 如果我手动进行操作,例如: 它按预期工作。但是,如果我必须事先知道某个函数是否装饰,它就破坏了装饰器的全部目的。这里的模式是什么,还是我误会了什么? 问题答案: tl; dr 您可以通过将类作为描述符并返回部分应用的函数来解决此问题,该函数从中应用对象作为参数之一,如下所示 实际问题

  • 问题内容: 问题是创建现有对象的动态增强版本。 我无法修改的。相反,我必须: 子类化 将现有对象包装在新对象中 将所有原始方法调用委托给包装的对象 实现另一个接口定义的所有方法 要添加到现有对象的接口是: 使用Byte Buddy,我设法继承了类并实现了我的接口。问题是委派给包装的对象。我发现做到这一点的唯一方法是使用反射速度太慢(我在应用程序上负担很重,性能至关重要)。 到目前为止,我的代码是:

  • 在MobX 中使用 ES.next 装饰器是可选的。本章节将解释如何(避免)使用它们。 使用装饰器的优势: 样板文件最小化,声明式代码。 易于使用和阅读。大多数 MobX 用户都在使用。 使用装饰器的劣势: ES.next 2阶段特性。 需要设置和编译,目前只有 Babel/Typescript 编译器支持。 启用装饰器 如果想使用装饰器,请按照以下步骤操作。 TypeScript 启用 tsco

  • 问题内容: 我很好奇AngularJS中的装饰器到底是什么。除了AngularJS文档中的简短内容和youtube视频中的简短提及(尽管很有趣)之外,装饰者在线上没有太多信息。 正如Angular所说的那样,装饰器是: 装饰服务,允许装饰者截取服务实例的创建。返回的实例可以是原始实例,也可以是委派给原始实例的新实例。 我真的不知道这 意味着 什么,而且我不确定为什么要将这种逻辑与服务本身分开。例如

  • 问题内容: 尽管有很多关于将类用作装饰器的资源,但我找不到能处理装饰 方法 问题的资源。这个问题的目的是解决这个问题。我将发布自己的解决方案,但是当然也邀请其他所有人发布他们的解决方案。 标准装饰器类实现的问题是python不会创建装饰函数的绑定方法: 方法装饰者需要克服这一障碍。 要求 以前面示例中的类为例,预期将完成以下工作: 理想情况下,函数和签名以及类似属性也应保留。 问题答案: 通常,当

  • Django为视图提供了数个装饰器,用以支持相关的HTTP服务。 允许的HTTP 方法 django.views.decorators.http 包里的装饰器可以基于请求的方法来限制对视图的访问。若条件不满足会返回 django.http.HttpResponseNotAllowed。 require_http_methods(request_method_list)[source] 限制视图只能

  • 装饰器(Decorators)(被babel支持, 在 03/17 之后作为stage-2的proposal被引入) 如果你在使用类似于mobx的库, 你能够使用装饰器装饰你的函数. 装饰器本质上其实就是将组件传入一个函数. 使用装饰器能让组件更灵活,更可读并且更易修改组件的功能. 不使用装饰器的例子 class ProfileContainer extends Component { //