在Python的类列表中引用类方法

2024-05-13 20:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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.spam0self.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不必是类属性,但是方法spam0spam1确实需要访问类成员,因此它们必须属于类。

我不确定这是最好的办法。我还在想办法。


Tags: 代码selfreturnparamondef情况spam
3条回答

当你在班里的时候,你可以写

class A:
    def spam(self):
        pass

    lut = [1, 2, 3, spam]

a = A()
print a.lut

给予

[1, 2, 3, <function spam at 0xb7bb764c>]

不要忘记这是查找表中的函数,而不是您可能想要的数字。你可能想解决另一个问题。

琐碎的:

class a:
    @classmethod
    def spam(cls):
        # not really pass, but you get the idea
        pass

    lut = [1,
           3,
           17,
           [12,34],
           5,
           spam]


assert a().lut[-1] == a.spam
assert a.spam() is None

在clas主体中,您正在创建类;没有self,因此您显然还不能引用self.anything。但是在这个主体中,在类主体完成之后还没有a:namea被绑定。所以,虽然这有点不那么明显,但是在类a的主体中,也不能引用a.anything

可以引用的是已经绑定的类属性的裸名称:例如,可以在列表的末尾使用5, spam]spam将以函数的形式出现,正如您在某一点上所说的那样;而不是作为方法,也绝不是作为类方法(我在您的代码中看不到classmethod任何地方,为什么您认为类方法会神奇地出现,除非您显式地将函数包装在内置的classmethod中,直接地或通过decorator?)--我怀疑您使用的“类方法”实际上并没有引用类方法类型(尽管它确实令人困惑;-)。

因此,如果您以后需要在a的某个实例x上调用该函数,您将调用例如a.lut[-1](x)的函数,其中显式地包含参数。

如果您需要做一些微妙的事情,那么在处理过程中的不同点(在类创建完成之后,或者如果您想要绑定实例方法,只有在特定实例被实例化之后),可能会得到某种类型的绑定或未绑定方法。但你并没有完全清楚地解释你到底想做什么,我们在这个后期的替代方案上提供非常详细的帮助。

相关问题 更多 >