如何将类方法分配给类属性?

时间:2015-05-05 12:28:27

标签: python oop

我正在尝试将类方法分配给class属性,因此我可以从string调用方法。当我使用类时,我想从字符串中调用它:

A.MAP['add'](x, y)
A.MAP['subtract'](x, y)

这是我目前的代码:

class A:
    MAP = {
        'add' : A.add(x, y),
        'subtract' : A.subtract(x, y),
    }

    @classmethod
    def add(cls, x, y)
        return x + y

    @classmethod
    def subtract(cls, x, y)
        return x - y

但是,结果显示A is not definedA.add分配给MAP['add']时出错。对于简短的函数,我可以使用lambda。但是,如果功能较长,我该如何实现这种设计?

2 个答案:

答案 0 :(得分:2)

请注意,当您尝试:

class A:
    MAP = {
        'add' : A.add(x, y),
        'subtract' : A.subtract(x, y),
    }

您正试图访问,例如在名称A.add存在之前A(该类在定义完成之前未绑定到名称)并且在名称add存在之前(您还没有定义该方法)。类定义顶层的所有内容都按按顺序完成。

你需要在定义类之后将类方法放入字典中(在定义完成之前它们不会变得可调用):

class A:

    MAP = {}

    @classmethod
    def add(cls, x, y):  # note colon
        return x + y

    @classmethod
    def subtract(cls, x, y):  # also here
        return x - y

A.MAP['add'] = A.add
A.MAP['subtract'] = A.subtract

请注意,由于类方法都不使用 cls,因此您可以改为使用@staticmethod。或者只是使用函数 - Python不是Java,你不需要将所有放入类中。

或者,您可以使用getattr按名称访问属性(包括类方法):

>>> class A:

        @classmethod
        def add(cls, x, y):
            return x + y

        @classmethod
        def subtract(cls, x, y):
            return x - y


>>> getattr(A, 'add')(1, 2)
3

答案 1 :(得分:1)

请不要在python中编程,而是使用更标准的oop方法:

#!/usr/bin/env python

class A:

    def __init__(self):
        pass

    @classmethod
    def add(self, x, y):
        return x + y

    @classmethod
    def subtract(self, x, y):
        return x - y

if __name__ == "__main__":
    a = A()
    print a.add(1,2)  # ans: 3
    print a.subtract(2,1) # ans: 1