2011-08-20 133 views
8

如何通过从与被调用方法相同的类中的另一个方法提供名称来执行方法?像这样:python变量方法名称

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 

任何建议?

回答

9

getattr(self, "func1")怎么样?此外,应避免使用该名称功能

例如:

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

如果你知道你想要的方法,就没有理由使用'getattr' - 只需抓住它。 –

5

你应该从类,而不是模块获取属性。

def func2(self): 
    method = getattr(self, "func1") 
    method("arg") 

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

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

这样可以避免调用一些你并不期望得到的东西。如果它不可调用,你可能想在这里提出你自己的异常。

+0

感谢它的工作 – Shaokan

+0

当你知道方法的名称时,不需要getattr'。另外,为什么要检查它是否可以调用?要么是(而应该是如果它是一种方法),要么会引发异常 - 这是处理错误的正确方法。 –

+2

@Ethan大概这个名字实际上是一个变量,这只是一个例子。可调用检查避免了错误,在一行代码中,并且意图更清晰,因为getattr可以返回任何类型的属性而不仅仅是方法。 – Keith