python – 装饰方法(类方法重载)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 装饰方法(类方法重载),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2920字,纯文字阅读大概需要5分钟。
内容图文
受Muhammad Alkarouri在What are good uses for Python3’s “Function Annotations”回答的启发,我想为方法而不是常规功能做这种多方法.但是,当我这样做
registry = {}
class MultiMethod(object):
def __init__(self, name):
self.name = name
self.typemap = {}
def __call__(self, *args):
types = tuple(arg.__class__ for arg in args) # a generator expression!
function = self.typemap.get(types)
if function is None:
raise TypeError("no match")
return function(*args)
def register(self, types, function):
if types in self.typemap:
raise TypeError("duplicate registration")
self.typemap[types] = function
def multimethod(function):
name = function.__name__
mm = registry.get(name)
if mm is None:
mm = registry[name] = MultiMethod(name)
types = tuple(function.__annotations__.values())
mm.register(types, function)
return mm
class A:
@multimethod
def foo(self, a: int):
return "an int"
a = A()
print( a.foo( 1 ) )
我懂了:
Traceback (most recent call last):
File "test.py", line 33, in <module>
print( a.foo( 1 ) )
File "test.py", line 12, in __call__
return function(*args)
TypeError: foo() takes exactly 2 arguments (1 given)
由于自我论证,正如Decorating a method所解释的那样,这似乎是预期的.
但我不知道如何让它发挥作用.好吧,当我删除“自我”时,它工作(几乎)很好,但我不想删除它.请注意,我正在练习这个,我知道有一些libs,提供方法重载.
我尝试了什么:
>非常愚蠢,但想尝试 – 在def multimethod(函数)中添加参数self – 同样的错误
>我想在MultiMethod类的__init__中添加第三个参数–obj并将self存储为成员,但我不能通过multimethod这样做,因为它是一个函数.
>我不想为装饰器添加参数,因此忽略了这些选项(如果可能的话)
我读了几个类似的问题,但没找到我要找的东西.我很确定这是一个虚假的问题,但我没有想法.
解决方法:
您遇到的基本问题是您使用类来代替函数.没有机制将该类绑定到它调用的实例,这与自动发生的函数不同.
简而言之,当你执行a.foo(..)它会返回一个MultiMethod,但是这个对象不知道它应该绑定到a??.
您必须以某种方式传递实例.一种简单的方法是将它全部包装在一个函数中,让Python做到这一点:
registry = {}
class MultiMethod(object):
def __init__(self, name):
self.name = name
self.typemap = {}
# self = a MultiMethod instance, instance = the object we want to bind to
def __call__(self, instance, *args):
types = tuple(arg.__class__ for arg in args) # a generator expression!
function = self.typemap.get(types)
if function is None:
raise TypeError("no match")
return function(instance, *args)
def register(self, types, function):
if types in self.typemap:
raise TypeError("duplicate registration")
self.typemap[types] = function
def multimethod(function):
name = function.__name__
mm = registry.get(name)
if mm is None:
mm = registry[name] = MultiMethod(name)
types = tuple(function.__annotations__.values())
mm.register(types, function)
# return a function instead of a object - Python binds this automatically
def getter(instance, *args, **kwargs):
return mm(instance, *args, **kwargs)
return getter
class A:
@multimethod
def foo(self, a: int):
return "an int", a
a = A()
print( a.foo( 1 ) )
更复杂的方法是在执行此绑定的A类上编写自己的描述符.
内容总结
以上是互联网集市为您收集整理的python – 装饰方法(类方法重载)全部内容,希望文章能够帮你解决python – 装饰方法(类方法重载)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。