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

标签 python oop

我正在尝试将类方法分配给类属性,以便我可以从字符串调用这些方法。使用该类时,我想从字符串中调用它,例如:

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 defined在分配 A.add 的行至MAP['add'] 。对于简短的功能,我可以使用 lambda 。但是,如果功能较长,如何实现这样的设计呢?

最佳答案

请注意,当您尝试时:

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

您正在尝试访问,例如A.add 在名称 A 存在之前(该类在定义完成之前不会绑定(bind)到该名称)并且在名称 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

关于python - 如何将类方法分配给类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30052961/

相关文章:

python - Python中MySQL语句语法错误(1064)

java - 创建后不应更改属性

python - Azure DevOps AzureFunctionApp@1 未安装 python 依赖项

用于处理不同类型事件的 Java 设计模式?

java - 继承和类型转换 : is this good java?

Java软件工程: Composition vs Aggregation

javascript - 这些是继承的属性吗?

python - 如何将月份名称更改为数字?

python - python "with"语句怎么写?

python - 选择 pandas df 中的字符串列(相当于 df.select_dtypes)