在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>