在python中编译时引用继承的方法

在python中编译时引用继承的方法,python,inheritance,function-pointers,Python,Inheritance,Function Pointers,我有一个专用的类,它从泛型类继承了一个@classmethod,并将一些字符串映射到方法: class Generic(object): @classmethod def generate_static_data(cls): return cls.field.upper() class Specialized(Generic): field = 'Some data' MAPPING = { # NameError: na

我有一个
专用的
类,它从
泛型
类继承了一个
@classmethod
,并将一些字符串映射到方法:

class Generic(object):

    @classmethod
    def generate_static_data(cls):
        return cls.field.upper()


class Specialized(Generic):

    field = 'Some data'

    MAPPING = {
        # NameError: name 'Specialized' is not defined
        'key': Specialized.generate_static_data,
    }

    def __init__(self):
        for key, meth in Specialized.MAPPING.iteritems():
            print(key, meth())
如何引用继承的方法

  • 我无法通过
    专用的
    类名引用它(可能是因为该类尚未被完全解析:
    #name错误:未定义名称“专用的”
  • 我不能在没有类名的情况下引用它,就像使用“local”方法一样:
    name错误:未定义名称“generate\u static\u data”
  • 如果我通过
    Generic
    类引用它,
    cls
    参数指向错误的类
编辑:很明显,可以将引用编码为字符串,并仅在运行时对其进行扩展,但我觉得这太复杂了:

MAPPING = {
    'key': 'generate_static_data',
}

def __init__(self):
    for key, meth in Specialized.MAPPING.iteritems():
        print(key, getattr(Specialized, meth)())
此外,在这个示例所来自的实际项目中,将字符串映射到字符串是默认设置,我非常喜欢将一些字符串映射到可调用项与映射到另一个恰好可解析为可调用项的字符串的区别。

Solution 1 我所知道的实现这一目标的最简单方法是:

class Generic(object):

    @classmethod
    def generate_static_data(cls):
        return cls.field.upper()


class Specialized(Generic):

    field = 'Some data'    

    def __init__(self):
        for key, meth in Specialized.MAPPING.iteritems():
            print(key, meth())

Specialized.MAPPING = {
    'key': Specialized.generate_static_data,
}
基本上,这定义了
Specialized。定义了
Specialized
之后的映射
,因此您不会遇到
name错误:未定义名称“Specialized”
问题:

>>> Specialized()
('key', 'SOME DATA')
<__main__.Specialized object at 0x1049e9d50>
这将导致相同的输出:

>>> Specialized()
('key', 'SOME DATA')
<__main__.Specialized object at 0x1065a2cd0>
专业化() (“键”,“一些数据”)
就个人而言,我认为第一种解决方案更简洁,但第二种解决方案保留了
专用
类中定义的所有内容。

您是否尝试过在专用构造函数中创建这样的映射?嗯,这意味着映射只有在创建至少一个实例后才能在类上可用?听起来可能会引起一些不愉快的惊喜;)事实上,你是对的:)
>>> Specialized()
('key', 'SOME DATA')
<__main__.Specialized object at 0x1065a2cd0>