Попытка использовать ** kwargs для определения атрибутов в классе - PullRequest
0 голосов
/ 27 февраля 2019

Итак, у меня есть класс, который определяет символы и его атрибуты, и он выглядит так:

class character():

    def __init__(self, health, dodge, damage, critAdd):

        self.health=health
        self.dodge=dodge
        self.damage=damage
        self.critAdd=critAdd

, и когда я создаю экземпляр следующим образом:

knight=character(150, 5, 40, 1.5)

, он отлично работает,Но то, что я пытаюсь создать, - это способ создать его с помощью ключевых значений, например:

knight=character(health=150, dodge=5, damage=40, critAdd=1.5)

Итак, я попытался написать __init__ вот так, используя **kwargs:

def __init__(self, **kwargs):

    self.health=health
    self.dodge=dodge
    self.damage=damage
    self.critAdd=critAdd

Там написано:

NameError: name 'health' is not defined

Что я делаю не так?Я действительно новичок в программировании, поэтому не могу понять.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

kwargs - это просто отображение;он магически не создает локальные переменные для вашей функции.Вам необходимо проиндексировать словарь Python с помощью требуемого ключа.

def __init__(self, **kwargs):
    self.health = kwargs['health']
    self.dodge = kwargs['dodge']
    self.damage = kwargs['damage']
    self.critAdd = kwargs['critAdd']

A класс данных упрощает это:

from dataclasses import dataclass

@dataclass
class Character:
    health: int
    dodge: int
    damage: int
    critAdd: float

Это автоматически генерирует ваш исходный __init__.

Если вам нужно выполнить дополнительную работу в __init__ после добавления декоратора класса данных, вы можете определить __post_init__, который класс данных будет вызывать после __init__.

0 голосов
/ 27 февраля 2019

Вам не нужно определять свой метод с помощью **kwargs для поддержки передачи аргументов по ключевому слову.Ваша оригинальная версия __init__ уже поддерживает синтаксис character(health=150, dodge=5, damage=40, critAdd=1.5), который вы хотите использовать.Ваша оригинальная версия на лучше , чем с использованием **kwargs, потому что она гарантирует, что были переданы точно правильные параметры, отвергая такие вещи, как helth=150 опечатки.

0 голосов
/ 27 февраля 2019

Вы должны использовать get(), например:

class Example():
    def __init__(self, **kwargs):

  self.health= kwargs.get('health', 10) # The first argument is the variable you want
                                        # The second is the default in case this kwarg do not exist


a = Example(health=50)
b = Example()

print(a.health)
print(b.health)

...