我正在用Python2.6.2编写一个包含查找表的类。大多数情况都很简单,表中包含数据。有些情况比较复杂,我希望能够调用函数。但是,我在引用函数时遇到了一些问题。
下面是一些示例代码:
class a:
lut = [1,
3,
17,
[12,34],
5]
其中lut
是静态的,并且预期也是常量。
现在我要做的是:
class a:
def spam0(self):
return (some_calculation_based_on_self)
def spam1(self):
return (a_different_calculation_based_on_self)
lut = [1,
3,
17,
[12,34],
5,
self.spam0
self.spam1]
这不会编译,因为self.spam0
和self.spam1
未定义。我试过使用a.spam
,但也没有定义。如何设置lut[5]
以返回对self.spam
的引用?
编辑:我计划这样做:
(继续定义class a
):
进口检验
# continue to somewhere in the definition of class a
def __init__(self, param):
self.param = param
def eggs(self):
tmp = lut[param]
if (insect.isfunction(tmp)): # if tmp is self.spam()
return tmp() # should call it here
return tmp
所以我要么返回一个简单的值,要么运行一些额外的代码,这取决于参数。
编辑:lut
不必是类属性,但是方法spam0
和spam1
确实需要访问类成员,因此它们必须属于类。
我不确定这是最好的办法。我还在想办法。
当你在班里的时候,你可以写
给予
不要忘记这是查找表中的函数,而不是您可能想要的数字。你可能想解决另一个问题。
琐碎的:
在clas主体中,您正在创建类;没有
self
,因此您显然还不能引用self.anything
。但是在这个主体中,在类主体完成之后还没有a
:namea
被绑定。所以,虽然这有点不那么明显,但是在类a
的主体中,也不能引用a.anything
。可以引用的是已经绑定的类属性的裸名称:例如,可以在列表的末尾使用
5, spam]
。spam
将以函数的形式出现,正如您在某一点上所说的那样;而不是作为方法,也绝不是作为类方法(我在您的代码中看不到classmethod
任何地方,为什么您认为类方法会神奇地出现,除非您显式地将函数包装在内置的classmethod
中,直接地或通过decorator?)--我怀疑您使用的“类方法”实际上并没有引用类方法类型(尽管它确实令人困惑;-)。因此,如果您以后需要在
a
的某个实例x
上调用该函数,您将调用例如a.lut[-1](x)
的函数,其中显式地包含参数。如果您需要做一些微妙的事情,那么在处理过程中的不同点(在类创建完成之后,或者如果您想要绑定实例方法,只有在特定实例被实例化之后),可能会得到某种类型的绑定或未绑定方法。但你并没有完全清楚地解释你到底想做什么,我们在这个后期的替代方案上提供非常详细的帮助。
相关问题 更多 >
编程相关推荐