在python中特别命名的动态类方法

时间:2017-02-14 00:23:56

标签: python python-2.7 class oop dynamic

在下面的示例中,我必须明确定义FunctionCharacter(i, d); 类中的所有'resolve'方法。

如果我可以在循环中自动定义这些方法会更简洁,因为它们几乎都做同样的事情,唯一的区别是与类成员变量的名称匹配的方法的名称返回。

Python 2.7可以实现吗?

ReturnValue

2 个答案:

答案 0 :(得分:2)

另一种方法是使用内置__getattribute__拦截方法调用,并在"解析"时返回特定属性。收到方法。

此代码应该完成这项工作:

class ReturnValue(graphene.ObjectType):
    class Meta:
        interfaces = (ReturnKeys,)

    def __getattribute__(self, attr):
        if attr.startswith("resolve_"):
            return lambda: getattr(self, attr[8:])
        return super().__getattribute__(attr)

与@Philip Tzou回答的不同之处在于,我们不会像setattr那样在类中添加每个方法。相反,我们直接返回需求属性。根据您的使用情况,这可能是好的与否。

另外,菲利普在答案结束时提到的内容很重要,如果你更换这一行,可以在上面的代码中实现:

return lambda: getattr(self, attr[8:])

为此:

return lambda: self.common_function(attr[8:])

此代码是用Python 3编写的,因此您可能需要更改super()语法才能在Python 2中使用。

答案 1 :(得分:1)

我认为这应该有效:

class ReturnValue(graphene.ObjectType):
    class Meta:
        interfaces = (ReturnKeys,)


def set_resolve_method(animal):
    setattr(
        ReturnValue,
        'resolve_' + animal,
        lambda self: getattr(self, animal)
    )

for animal in ('dog', 'cat', 'horse', 'bear'):
    # this function scoped the variable `animal`
    set_resolve_method(animal)

但是你知道,它并没有节省太多的线路。我认为明确定义每个方法实际上是一种更好的和pythonic方式。如果您正在尝试重用某些复杂的代码,只需将每个方法中的公共部分隔离出来并将它们放入一个单独的函数中,如下所示:

def common_function(animal):
    pass  # do something here


class ReturnValue(graphene.ObjectType):
    class Meta:
        interfaces = (ReturnKeys,)

    def resolve_dog(self):
        return common_function(self.dog)

    def resolve_cat(self):
        return common_function(self.cat)

    ...