Как мы вызываем класс, не передавая переменные при вызове?

#python

#python

Вопрос:

Вот MRE:

 class Dog():
    def __init__(self, action, name):
        self.action = action
        self.name = name

    def name_dog(self):
        my_name = input("give me a name: ")
        return self.name(my_name)

    def act_like_dog(self):
        order = input("Tell me to do something: ")
        msg = self.name   " is "   order
        return self.action(msg)

    def main(self):
        self.name_dog()
        self.act_like_dog()

Dog.main()
 

Основная цель вызова класса dog в этом случае заключается в том, чтобы пользователь вводил свои собственные значения (имя, действие) для класса. Таким образом, переменные для указанного мной класса ( Dog class) получаются из вызова функции ( self.name_dog and self.act_like_dog ) в main() функции, которая предлагает пользователю ввести свой ввод. Однако, когда я попытался вызвать main() функцию без self , я получил сообщение об ошибке, в котором говорится, что требуется позиционный аргумент, в то время как если я вызвал функцию self() , ошибка говорит, что self она не определена. Как мне это исправить?

Комментарии:

1. Вам нужен экземпляр. Что-то вроде Dog().main()

2. Что вы ожидаете сделать self.name(my_name) ?

3. И вам нужно будет передать action и name как в Dog('bark', 'fido') , если вы не дадите им значения по умолчанию в __init(...)__ методе.

4. @jarmod Разве это не помешает цели запроса пользователя?

5. Тогда было бы разумнее поместить подсказки в __init__

Ответ №1:

Вы, кажется, запутались в нескольких элементах.

Вам нужно создать фактический экземпляр класса, чтобы иметь возможность классифицировать его методы — Dog(...) . Помимо этого, существует логическая проблема, когда вы ожидаете создать экземпляр с name помощью and action , но затем принимаете их в качестве входных данных от пользователя. Я думаю, что вам нужно просто установить атрибуты с помощью пользовательского ввода в __init__ . Что-то вроде:

 class Dog():
    def __init__(self):
        self.name = self.name_dog()
        self.action = self.act_like_dog()
        
    def name_dog(self):
        my_name = input("give me a name: ")
        return my_name

    def act_like_dog(self):
        order = input("Tell me to do something: ")
        msg = self.name   " is "   order
        return msg

dog = Dog()
 

Если вы хотите иметь возможность изменять name и action позже, вы можете использовать свою main идею:

 class Dog():
    def __init__(self):
        main()

    ...

    def main():
        self.name = self.name_dog()
        self.action = self.act_like_dog()

dog = Dog()
 

Комментарии:

1. Разве мы не можем поместить все эти функции в одну основную функцию? Поэтому, когда мы вызываем основную функцию, name_dog и act_like_dog также будут вызваны.

Ответ №2:

Возможно, вы ищете что-то вроде этого:

 class Dog:
    def __init__(self, action=None, name=None):

        if name:
            self.name = name
        else:
            self.name = input("Dog's name: ")

        if action:
            self.action = action
        else:
            self.action = input("Dog's action: ")

d = Dog()
# ... or ...
d = Dog("Max", "Bark")
# ... or ...
d = Dog("Max")
d = Dog(name="Max")
# ... or ...
d = Dog(action="Bark")