【发布时间】:2019-01-01 09:49:35
【问题描述】:
这是我第一次尝试,所以...
我正在关注:https://www.python-course.eu/python3_decorators.php
目标是当我像这样初始化 Foo 的实例时:
f = Foo(10, [1, 2, 3, 4, 5])
print(f) 的输出需要如下所示:
Instance of Foo, vars = {'x': 10, 'y': [1, 2, 3, 4, 5]}
装饰器类的作用是作为一种自动的repr。
我有这个:
class ClassDecorator(object):
def __init__(self, cls):
self.cls = cls
print("An instance of Foo was initialized")
def __call__(self, cls, *args, **kwargs):
print("Instance of Foo, vars = ", kwargs)
@ClassDecorator
class Foo(object):
def __init__(self, x, y):
self.x = x
self.y = y
f = Foo(10, [1, 2, 3, 4, 5])
print(f)
产量:
An instance of Foo was initialized
Instance of Foo, vars = {}
None
我不认为我想要 *args,但没有它我的程序会出错:
Traceback (most recent call last):
An instance of Foo was initialized
File "C:/Users/Mark/PycharmProjects/main/main.py", line 17, in <module>
f = Foo(10, [1, 2, 3, 4, 5])
TypeError: __call__() takes 2 positional arguments but 3 were given
我理解缺少参数的问题,但是如果 10 是 'x' 而 [1, 2, 3, 4, 5] 是 'y',那么我就是不明白为什么 **kwargs 不够.
【问题讨论】:
-
你的类没有覆盖
__repr__,它干扰了Foo的初始化。你打印 "An instance of Foo was initialized" 实际上是ClassDecorator的实例被初始化的地方,Foo永远不会被初始化。你没有得到ClassDecorator.__call__的cls参数,它只会得到*args和**kwargs。 -
为什么这会让你想使用一个类作为装饰器?
-
装饰器的一个有问题的用例。
-
您的问题是什么?你在问为什么没有
*args的**kwargs不足以转发?如果是这样,所有关于类装饰器和__repr__的东西都无关紧要。或者您的问题是关于如何编写一个向其参数添加方法的类装饰器?还是别的什么? -
如果问题是关于转发的:
**kwargs只收集不匹配的关键字参数,不收集不匹配的位置参数。否则它就无法做到——你的def签名(或其他任何地方)中没有任何内容可以让 Python 了解你的期望。
标签: python python-3.x class python-3.6 python-decorators