Code:
import functools
class MyInt1(int):
def __new__(cls, x, value):
print("MyInt1.__new__", cls, x, value)
return super().__new__(cls, x, base=2)
def __init__(self, x, value):
print("MyInt1.__init__", self, x, value)
self.value = value
super().__init__()
class MyInt2:
def __init__(self, x, value):
print("MyInt2.__init__", self, x, value)
self.value = value
def decorator(class_):
class Wrapper(class_):
def __new__(cls, *args, **kwargs):
print("Wrapper.__new__", cls, args, kwargs)
obj = super().__new__(cls, *args, **kwargs)
...
return obj
def __init__(self, *args, **kwargs):
print("Wrapper.__init__", self, args, kwargs)
functools.update_wrapper(self, class_)
super().__init__(*args, **kwargs)
return Wrapper
c = decorator(MyInt1)("101", 42)
print(c, c.value)
c = decorator(MyInt2)("101", 42)
print(c, c.value)
Output:
Wrapper.__new__ <class '__main__.decorator.<locals>.Wrapper'> ('101', 42) {}
MyInt1.__new__ <class '__main__.decorator.<locals>.Wrapper'> 101 42
Wrapper.__init__ 5 ('101', 42) {}
MyInt1.__init__ 5 101 42
5 42
Wrapper.__new__ <class '__main__.decorator.<locals>.Wrapper'> ('101', 42) {}
Traceback (most recent call last):
File "tmp2.py", line 42, in <module>
c = decorator(MyInt2)("101", 42)
File "tmp2.py", line 28, in __new__
obj = super().__new__(cls, *args, **kwargs)
TypeError: object() takes no parameters
- 如果我真的不知道传递给装饰器的类是什么,应该如何处理?
- 为什么它不适用于常见模式?
- 为什么默认
__new__
不接受__init__
论点?
我发现的唯一方法是inspect.isbuiltin
检查super().__new__
和分支,但这很脏。