如何通过字符串形式的函数名称访问函数?

3
class Dog:

    # Class Attribute
    species = 'mammal'

    # Initializer / Instance Attributes
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # instance method
    def description(self):
        return "{} is {} years old".format(self.name, self.age)

    # instance method
    def speak(self, sound):
        return "{} says {}".format(self.name, sound)


args, varargs, keywords, defaults = inspect.getargspec(getattr(globals()['Dog'](), 'description'))'''

上面的代码会出现以下错误信息:
args, varargs, keywords, defaults = 
inspect.getargspec(getattr(globals()['Dog'](), 'description'))
TypeError: __init__() takes exactly 3 arguments (1 given)

但是,如果我这样做...

args, varargs, keywords, defaults = inspect.getargspec(getattr(Dog, 'description'))

我没有收到任何错误信息。

由于我想从一个文件中访问另一个文件的类名和函数名,所以我只有名称字符串,这就是为什么我尝试了之前的方法而出现错误的原因。

这个问题的解决方案是什么?


请问您能否重新格式化您的问题,因为目前很难理解您想要实现什么?当您说“我只有一串名字字符串”时,您是指什么? - rednafi
我的意思是,我有一个文件中类和函数的名称列表,当我尝试从这个列表中提取名称并直接调用函数时,由于它是字符串类型,这是不可能的。 - JJ_29
2个回答

0
你差不多走在正确的路上了。然而,你没有正确地初始化Dog类。为了使description方法起作用,你必须用两个参数初始化类Dog('scooby',10),其中scooby狗的名字10狗的年龄
import inspect

class Dog:

    # Class Attribute
    species = "mammal"

    # Initializer / Instance Attributes
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # instance method
    def description(self):
        return "{} is {} years old".format(self.name, self.age)

    # instance method
    def speak(self, sound):
        return "{} says {}".format(self.name, sound)

让我们将description方法作为字符串运行:

getattr(globals()["Dog"]("scooby", 10), "description")()

这个显示:
>> 'scooby is 10 years old'

让我们将speak方法作为字符串运行。请注意speak方法需要额外的参数:

getattr(globals()["Dog"]("scooby", 10), "speak")("woof")

这显示:

>> 'scooby says woof'

0
错误意味着您正在尝试实例化一个 Dog,但没有提供 nameage 参数:
args, varargs, keywords, defaults = inspect.getargspec(getattr(globals()['Dog'](), 'description'))
                                                                                ^ here

在你最后的代码片段中,你没有实例化Dog
也许你是想省略括号:
args, varargs, keywords, defaults = inspect.getargspec(getattr(globals()['Dog'], 'description'))

更新:

请注意,自Python3.0以来,getargspec()已被弃用。

建议使用signature()getfullargspec(),它们分别返回不同的类型。

请参见文档


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