Python 是否可以将对象字段直接初始化为_uinit_u;关键字参数?

Python 是否可以将对象字段直接初始化为_uinit_u;关键字参数?,python,class,Python,Class,当我编写一个类时,我经常这样做: class Bulbasaur: """Quite obviously, the best pokemon""" self __init__(self, n_potions = 0, berries = 0, nickname = '') self.n_potions = n_potions self.berries = berries self.nickname = nickname 也许有其他方法来处理以下问题-如果有请 提

当我编写一个类时,我经常这样做:

class Bulbasaur:
  """Quite obviously, the best pokemon"""
  self __init__(self, n_potions = 0, berries = 0, nickname = '')
    self.n_potions = n_potions
    self.berries = berries
    self.nickname = nickname
也许有其他方法来处理以下问题-如果有请 提供(!)-但这样做似乎更简单:

class Bulbasaur:
  """Quite obviously, the best pokemon"""
  self __init__(self, self.n_potions = 0, self.berries = 0, self.nickname = '')
    pass
其中字段将直接由
\uuuu初始化\uuuu
参数。 这可能吗?如果没有,它的设计缺陷是什么?如果没有,有没有
处理上述场景的更好方法是什么?

这是Python中有意做出的设计决策:在定义实例应具有的属性或在创建对象后初始化对象时没有特殊语法
\uuuu init\uuuu
只是另一种方法,尽管是在实例化类的过程中调用的方法

Python3.7中引入的数据类提供了一种减少一些样板文件的方法。class语句体中带注释的变量用于定义
\uuuuuu init\uuuuu
(以及其他特殊方法)的默认实现,该实现实现了您通常需要的功能,即仅基于
\uuuuuu init\uuuuu
的参数设置属性:

from dataclasses import dataclass


@dataclass
class Bulbasaur:
    n_potions: int = 0
    berries: int = 0
    nickname: str = ''


b1 = Bulbasaur()
assert b1.n_potions == 0 and b1.berries == 0 and b1.nickname == ''
b2 = Bulbasaur(3, 2, 'foo')
assert b2.n_potions == 3 and b2.berries == 2 and b2.nickname == 'foo'

dataclass
有帮助吗?这是Python 3.7中的一个新特性。该缺陷是函数参数必须是变量名
self.n_potations
不是变量,它是一个对象属性。初始化init body中的属性有什么不对?这也是!