Python变量方法的名称

10

如何在一个方法中调用同一个类中另一个方法的名称?就像这样:

class Class1:
    def __init__(self):
        pass
    def func1(self, arg1):
        # some code
    def func2(self):
        function = getattr(sys.modules[__name__], "func1") # apparently this does not work

有什么建议吗?

2个回答

11

如何使用getattr(self, "func1")?另外,避免使用函数名。

例如:

>>> class C:
...  def f1(self, arg1): print arg1
...  def f2(self): return getattr(self, "f1")
... 
>>> x=C()
>>> x.f2()(1)
1

如果您知道所需的方法,就没有使用getattr的理由 - 只需获取它即可。 - Ethan Furman

6
你应该从类中获取属性,而不是从模块中获取。
def func2(self):
    method = getattr(self, "func1")
    method("arg")

但是你也应该检查它是否可调用。

if callable(method):
    method("arg")

这样可以避免调用意外的内容。如果无法调用,你可能需要在此处引发自己的异常。请保留HTML标记,我会为您进行翻译。

当您知道方法名称时,使用getattr是不必要的。而且,为什么要检查它是否可调用?它要么是(如果是方法,则应该如此),要么会引发异常——这才是处理错误的正确方式。 - Ethan Furman
3
@Ethan 可能该名称实际上是一个变量,而这只是一个示例。可调用的检查避免了错误,只需一行代码,意图更清晰,因为 getattr 可以返回任何类型的属性,而不仅仅是方法。 - Keith
1
嗯...好的,我可以看到名称在变量中(原始问题措辞不当),尽管我仍然大多不同意可调用检查:如果它不可调用,你会怎么做?抛出异常?除非你有充分的理由,否则就让试图调用非可调用对象的异常自行传递。 - Ethan Furman
2
@Ethan 这些是很好的问题,但超出了 OP 的问题范围。OP 将不得不考虑其他设计标准来决定这些事情。但总的来说,我认为错误检查或避免错误是一件好事。 - Keith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接