gpt4 book ai didi

python - 我如何定义一个依赖于尚未定义的东西的数据结构?

转载 作者:行者123 更新时间:2023-11-28 21:59:48 25 4
gpt4 key购买 nike

我想定义一个字典,这样一个函数,比如 run(),被一些助记符调用时,它会调用类中的一个成员函数。所以我想出了以下办法:

class foo:
dict = { 'f_func' : f, 'g_func': g }
def f():
pass
def g():
pass
def run(self, n):
# ... do something
dict[n]()

现在的问题是 dict 中的值是尚未定义的成员函数。我怎样才能做到这一点?

或者任何其他解决方法?

最佳答案

您稍后定义结构,在本例中是在 __init__ 方法中,以确保您有绑定(bind) 方法:

class foo:
def __init__(self):
self.dict = { 'f_func' : self.f, 'g_func': self.g }
def f(self):
pass
def g(self):
pass
def run(self, n):
# ... do something
self.dict[n]()

或者,按名称查找方法:

class foo:
dict = { 'f_func' : 'f', 'g_func': 'g' }
def f(self):
pass
def g(self):
pass
def run(self, n):
# ... do something
getattr(self, self.dict[n])()

类定义完成后,您始终可以更改类:

class foo:
def f(self):
pass
def g(self):
pass
def run(self, n):
# ... do something
self.dict[n](self)

foo.dict = { 'f_func' : foo.f, 'g_func': foo.g }

但是它存储了未绑定(bind)的方法,迫使您显式地传入 self

最后,您可以将 dict 的定义移动到定义了 fg 函数的地方:

class foo:
def f(self):
pass
def g(self):
pass

dict = { 'f_func' : f, 'g_func': g }

def run(self, n):
# ... do something
self.dict[n](self)

类主体像函数一样执行,局部 namespace 变成类属性。现在 dict 值是函数,与未绑定(bind)方法有同样的问题;您需要显式传入 self 。 (在 Python 3 中不再有未绑定(bind)的方法,这个解决方案和之前的解决方案是等价的)。

您可能希望避免使用 dict 作为属性名称,因为它会导致与内置的 dict 类型混淆。

关于python - 我如何定义一个依赖于尚未定义的东西的数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16034867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com