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

时间:2019-05-17 14:45:26

标签: 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, self.n_potions = 0, self.berries = 0, self.nickname = '')
    pass

直接在其中用正确的值填充字段的位置 __init__个参数。 这可能吗?如果没有,它的设计缺陷是什么?如果没有,那里 解决上述情况的更好方法?

1 个答案:

答案 0 :(得分:2)

这是Python中的一个故意设计决策:没有特殊的语法来定义实例应具有的属性或在创建对象后初始化对象。 __init__只是另一种方法,尽管在实例化类的过程中会调用该方法。

Python 3.7中引入的数据类提供了减少某些样板的方法。类语句主体中带注释的变量用于定义__init__的默认实现(以及其他特殊方法),该实现实现您通常想要的操作,即仅基于__init__的参数设置属性:

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'