首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python (2.7):动态添加类方法

Python (2.7):动态添加类方法
EN

Stack Overflow用户
提问于 2012-11-11 23:51:56
回答 1查看 684关注 0票数 3

我有一些类,它们的方法我想可以随意地添加到其他类中。我最初的解决方案是使用mixins,但这可能会变得有点难看:

代码语言:javascript
复制
class Schedule(Enumerator, Humanizer, Inferer, ...):
    ...

所以我想,嘿,也许我可以用类装饰来达到同样的效果。

代码语言:javascript
复制
@enumerator
@humanizer
@inferer
class Schedule(object):
    ...

下面是装饰器函数的示例:

代码语言:javascript
复制
import inspect

def inferer(original_class):
    from myproj.lib.inferer import Inferer
    methods = inspect.getmembers(Inferer, predicate=inspect.ismethod)
    for method in methods:
        setattr(original_class, method[0], types.MethodTypes(method[1], original_class))
    return original_class

...which似乎将方法和类方法适当地添加到修饰类中。但是,当我在修饰类上调用这些添加的方法(或类方法)之一时,我会得到一些错误。

关于方法:

代码语言:javascript
复制
>>> Schedule().humanize()
TypeError: unbound method humanize() must be called with Humanizer instance as first argument (got type instance instead)

...which似乎表明这些是作为类方法添加的?

对于类方法:

代码语言:javascript
复制
>>> schedule = Schedule.infer(foo)
TypeError: infer() takes exactly 2 arguments (3 given)

注意推断的定义:

代码语言:javascript
复制
class Inferer(object):
    @classmethod
    def infer(cls, dates):
        ...

我在infer中添加了一些行,以显示它在被调用为Schedule.infer()时得到了哪些参数

代码语言:javascript
复制
cls: <class 'myproj.lib.inferer.Inferer'>
dates: <class 'myproj.Schedule'>

所以,我的问题是:

装饰函数中有什么问题会导致这些添加的方法和类方法表现得很奇怪呢?或者,更好地说,我如何修改装饰功能以正确处理这些添加?

请让我知道,如果我可以提供任何澄清的任何一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-12 00:09:17

假设这是个好主意。这是你实现它的一种方式。不过,我不能说我会提出建议。

代码语言:javascript
复制
def horrible_class_decorator_factory(mixin):
    def decorator(cls):
        d = cls.__dict__.copy()
        bases = tuple([b for b in cls.__bases__ if b != object] + [mixin])
        return type(cls.__name__, bases, d)
    return decorator

现在你可以这样做了:

代码语言:javascript
复制
class Inferer(object):
    @classmethod
    def foo(cls):
        return "bar" + cls.__name__

inferer = horrible_class_decorator_factory(Inferer)

@inferer
class X(object):
    pass

X.foo()
"barX"

我和评论员一起写这篇文章。你能做点什么并不意味着你应该这么做。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13336768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档