如何使用类装饰器包装器?
我有一个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
这样您就不必创建一个新类,该类需要伪装成旧类,而旧类从未被使用过。