python – 动态地将callable添加到类作为实例“方法”
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 动态地将callable添加到类作为实例“方法”,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2624字,纯文字阅读大概需要4分钟。
内容图文
![python – 动态地将callable添加到类作为实例“方法”](/upload/InfoBanner/zyjiaocheng/800/4047d84c51194b36aac34e74143dbe88.jpg)
我实现了一个元类,它删除了用它创建的类的类属性,并从这些参数的数据构建方法,然后将这些动态创建的方法直接附加到类对象(有问题的类允许轻松定义Web表单对象在Web测试框架中使用).它已经工作得很好,但现在我需要添加一个更复杂的方法类型,为了保持干净,我实现了一个可调用的类.不幸的是,当我尝试在一个实例上调用可调用类时,它被视为一个类属性而不是一个实例方法,并且在被调用时,只接收它自己的self.我可以看出为什么会发生这种情况,但我希望有人可能比我提出的更好的解决方案.问题的简化说明:
class Foo(object):
def __init__(self, name, val):
self.name = name
self.val = val
self.__name__ = name + '_foo'
self.name = name
# This doesn't work as I'd wish
def __call__(self, instance):
return self.name + str(self.val + instance.val)
def get_methods(name, foo_val):
foo = Foo(name, foo_val)
def bar(self):
return name + str(self.val + 2)
bar.__name__ = name + '_bar'
return foo, bar
class Baz(object):
def __init__(self, val):
self.val = val
for method in get_methods('biff', 1):
setattr(Baz, method.__name__, method)
baz = Baz(10)
# baz.val == 10
# baz.biff_foo() == 'biff11'
# baz.biff_bar() == 'biff12'
我想到了:
>使用描述符,但这似乎比这里必要的更复杂
>在foo中使用工厂内部的闭包,但嵌套闭包是大多数时候对象的丑陋和凌乱的替换,imo
>将Foo实例包装在一个方法中,将其自身向下传递给Foo实例作为实例,基本上是一个装饰器,这是我实际添加到Baz中的东西,但这似乎是多余的,基本上只是一种更复杂的方式来做同样的事情(2)
有没有比这更好的方法来尝试完成我想要的东西,或者我应该咬紧牙关并使用一些封闭工厂类型模式?
解决方法:
一种方法是将可调用对象作为未绑定方法附加到类.方法构造函数将使用任意可调用对象(即具有__call __()方法的类的实例) – 而不仅仅是函数.
from types import MethodType
class Foo(object):
def __init__(self, name, val):
self.name = name
self.val = val
self.__name__ = name + '_foo'
self.name = name
def __call__(self, instance):
return self.name + str(self.val + instance.val)
class Baz(object):
def __init__(self, val):
self.val = val
Baz.biff = MethodType(Foo("biff", 42), None, Baz)
b = Baz(13)
print b.biff()
>>> biff55
在Python 3中,没有未绑定的实例(类只附加了常规函数),所以你可以改为使你的Foo类成为一个描述符,通过给它一个__get __()方法来返回一个绑定的实例方法. (实际上,这种方法也适用于Python 2.x,但上面的方法会更好一些.)
from types import MethodType
class Foo(object):
def __init__(self, name, val):
self.name = name
self.val = val
self.__name__ = name + '_foo'
self.name = name
def __call__(self, instance):
return self.name + str(self.val + instance.val)
def __get__(self, instance, owner):
return MethodType(self, instance) if instance else self
# Python 2: MethodType(self, instance, owner)
class Baz(object):
def __init__(self, val):
self.val = val
Baz.biff = Foo("biff", 42)
b = Baz(13)
print b.biff()
>>> biff55
内容总结
以上是互联网集市为您收集整理的python – 动态地将callable添加到类作为实例“方法”全部内容,希望文章能够帮你解决python – 动态地将callable添加到类作为实例“方法”所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。