python - Python。绑定方法、Mixins 和类装饰器
问题描述
我遇到了一个非常烦人的特殊问题。我希望有人能告诉我。首先,我有一个延迟函数返回值的类装饰器,在这种情况下,我将让它不做任何事情来简化事情。
class MyDecorator(object):
def __init__(self, func, *args):
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
@classmethod
def decorate(cls, func, delay=0):
return cls(func, delay)
然后我有一个 mixin,它有一个带有所需参数的方法,我在这个方法上附加了这个装饰器。
class MyMixin(object):
@MyDecorator.decorate
def my_method(self, arg1, *args, **kwargs):
pass
然后我使用我的 Mixin
class MyImplementation(MyMixin, object):
pass
m = MyImplementation()
m.my_method('my first argument')
然后我得到错误
TypeError: my_method() missing 1 required positional argument: 'arg1'
对于那些想知道的人,参数“我的第一个参数”实际上替换了 self,因为 self 没有被传递甚至无法访问,因此需要另一个参数 arg1。
现在我知道为什么会发生这种情况,用类装饰器包装方法会创建一个对象,而不是一个函数,并且对象不能绑定到一个类。我有一些如何克服它的想法(最直接的是元类实现,但由于我试图做的事情的本质是一个不能很好工作的混入)。我只是在寻找一些关于如何在将方法提供给装饰器之前将方法绑定到实例的建议(这似乎很奇怪,这不会自动发生,但我想 staticmethod 和 classmethod 要求这不会发生)这样我就不必定义构造函数(因为你好,Mixin)。
解决方案
推荐阅读
- javascript - UTC 中的日期时间与 toISOString
- oracle-adf - 在 Glassfish 服务器 5.0 中部署 ADF1.2.2.1.4 时出现异常
- docker - Trying to understand how docker works in production for a scalable symfony application
- mailkit - Mailkit 通过 LinkedResources.Add 使用资源图像
- c# - 关闭表单后如何保留 numericupdown 中的值
- python - 我想在文章链接到编辑表单时显示值
- haskell - 构建无限列表的排序无限列表
- flutter - 如何使用 bloc -Flutter 将数据传递到另一个屏幕
- typescript - 循环引用 AWS appsync
- java - gRPC如何在流中的两条消息之间设置超时