Как получить доступ к функции с именем в виде строки? - PullRequest
3 голосов
/ 10 февраля 2020
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'))

.. Я не получаю никаких ошибок .

Поскольку я хочу получить доступ к именам классов и имен функций одного файла из другого, у меня просто есть строка имен, поэтому я пытался использовать предыдущий метод, который дает мне ошибку.

Какое решение для этого?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Вы почти на правильном пути. Однако вы неправильно инициализируете класс Dog. Чтобы метод description работал, вы должны инициализировать класс с двумя параметрами Dog('scooby', 10), где scooby - это имя-участника , а 10 - это dogage .

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 голосов
/ 10 февраля 2020

Ошибка означает, что вы пытаетесь создать экземпляр Dog, но без параметров name и age:

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(), каждый из которых возвращает разные типы.

См. документацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...