gpt4 book ai didi

同一类中的 Python 函数指针

转载 作者:行者123 更新时间:2023-11-28 19:39:38 24 4
gpt4 key购买 nike

我在 Python 中有以下类,我试图通过具有可用函数指针的字典来调用一组它自己的方法:

class Test():

functions = {
'operation_a' : Test.function_a;
'operation_b' : Test.function_b;
}

def run_operations(operation, *args, **kwargs):

try:
functions[str(operation)](self, args, kwargs)
except KeyError:
// some log ...

def function_a(self, *args, **kwargs):
print A

def function_b(self, *args, **kwargs):
print B

第一种方法似乎不正确,因为 Python 解释器找不到类“Test”(NameError:“Test”未定义)。我找不到方法(导入包、包和模块,from package.module import *...等)因此,我有 3 个解决方案来解决这个问题,这些解决方案已经适用于我:

  1. 在类构造函数中定义操作字典 (__init__()),
  2. 将可调用函数移动到不同的类(在我的例子中,类在不同的模块中,我没有尝试在同一模块中使用类),
  3. 在同一个类中将函数定义为@staticmethod

但是,我仍然不知道为什么最初的方法似乎不正确。因此,如何在实例化之前引用同一个类中的函数?

最佳答案

类对象在类语句主体结束之前不存在。但是这些函数在 def 语句主体之后 的命名空间中可用。所以你想要的是:

class Test(object):

def run_operations(self, operation, *args, **kwargs):
try:
function = self.functions[operation]
except KeyError:
# some log ...
else:
function(self, args, kwargs)

def function_a(self, *args, **kwargs):
print "A"

def function_b(self, *args, **kwargs):
print "B"

functions = {
'operation_a' : function_a,
'operation_b' : function_b,
}

编辑: 正如 alko 提到的,您还可以使用 getattr 和当前实例和方法名称来获取方法,但这意味着所有方法都成为潜在的“操作” ,这既不明确又是潜在的安全问题。仍然使用 getattr 并显式“选择”合法操作的一种方法是仅向相关函数添加标记,即:

def operation(func):
func.is_operation = True
return func

class Test(object):
def run_operations(self, operation, *args, **kwargs):
method = getattr(self, operation, None)
if method is None:
# raise or log or whatever
elif not method.is_operation:
# raise or log or whatever
else:
method(*args, **kwargs)

@operation
def operation_a(self, *args, **kwargs):
print "A"

@operation
def operation_b(self, *args, **kwargs):
print "B"

def not_an_operation(self):
print "not me"

另一种解决方案是使用内部类作为操作的命名空间,即:

class Test(object):

def run_operations(self, operation, *args, **kwargs):
method = getattr(self.operations, operation, None)
if method is None:
# raise or log or whatever
else:
method(self, *args, **kwargs)

class operations(object):
@classmethod
def operation_a(cls, instance, *args, **kwargs):
print "A"

@classmethod
def operation_b(cls, instance, *args, **kwargs):
print "B"

还有其他可能的解决方案。哪一个是“最好的”取决于您的需求,但除非您正在构建一个框架,否则基于字典的框架尽可能简单、可读和有效。

关于同一类中的 Python 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20381904/

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