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

我有一个data_class对象,想使用装饰器添加一些功能。它有效,但是类名丢失并变为defaultinstance.<locals>.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)

回答

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

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.woof()  # as it's a class method we can use it directly on Dog
doggo.woof()  # but it works fine on doggo too

结果

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

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


以上是如何使用类装饰器包装器?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>