#python
#питон
Вопрос:
Я поставил задачу решить и понять концепцию ООП на Python. В следующем коде я не понял, какова цель этой следующей строки?
user.args = argparse.Namespace(**data)
И как мне получить доступ к аргументам ключевых слов в методе пользовательского класса displayUser, потому что объект пользовательского класса уже создан до передачи аргумента. Вот что я подумал.
Кто-нибудь может объяснить следующий код?
import argparse class User(object): def __init__(self): pass def displayUser(self): pass if __name__ == "__main__": data = { "val_1": "John", "val_2": "Doe", } user = User() user.args = argparse.Namespace(**data)
Комментарии:
1. В настоящее время линия, похоже, не имеет никакого назначения, потому
user.args
что нигде не используется.displayUser
не имеет аргументов ключевых слов, поэтому мне непонятно, как вы хотите получить к ним доступ.2. Это очень странное использование argparse, обычно вы используете пространства имен через аргумент для синтаксического анализа. Чтобы ответить на ваш вопрос: вы можете получить доступ к значениям с
user.args.val_1
помощью, но я не думаю, что это то, что вы пытаетесь сделать.3. Я могу догадаться , что вы хотите сделать: В
displayUser
, напишите что-нибудь вродеprint(self.args.val_1)
.4. @mkrieger1 Итак, в таком случае нам не нужно передавать аргументы через объект? Когда мы используем
argparse.Namespace()
5. Обычно вы
argparse.Namespace
вообще не должны использовать. Он просто существует как контейнер для аргументов командной строки, возвращаемыхargparse
.
Ответ №1:
Я думаю, что ты хочешь сделать что-то вроде этого:
def displayUser(self): print(f"Firstname: {self.args.val_1}, last name: {self.args.val_2}")
Вы можете напрямую получить доступ к val_1 и val_2 из объекта пространства имен, для которого вы установили значение user.args
. В python вы можете задавать поля объекта, несмотря на то, что они не определены в конструкторе, является ли это хорошим подходом, это совершенно другой вопрос (это не так, имхо).
Комментарии:
1. Итак, в таком случае нам не нужно передавать аргументы через объект? Когда мы используем
argparse.Namespace()
2. @trojanatwar Я точно не знаю, что вы имеете в виду, говоря «передавать аргументы через объект». Но с пространством имен argparse.вы в основном преобразуете словарь в структурированный «тип», где вы можете получить доступ к значениям ключей так же, как и в классе. (Подумайте о структуре в c или классе без методов). Хотя мне на самом деле не очень нравится это использование здесь. Лучше пусть имя и фамилия будут даны конструктору и явно сохранят их там.