【问题标题】:How to set an attirbutes list when creating new object创建新对象时如何设置属性列表
【发布时间】:2020-09-13 22:53:39
【问题描述】:

希望标题不要太混乱。我一直在研究程序,并且创建了带有默认列表的属性。问题是当我创建这个对象时,我不知道如何修改该列表。谢谢你

    def __init__(self,nm,pm,adss):
        self._nom =  nm
        self._prenom = pm
        self._adresse = adss
        self._bonus = [0,0,0,0]```

employer1 = Employe("nom","prenom","adresse",[0,250,50,10] #For exemple I wanted to set 
#the list for that one. But im not sure if I can do it like that or if I might need to create a new function for it.

【问题讨论】:

  • 你能一直传递bonus作为参数吗?如果是这样,那么您可以像对待所有其他参数一样对待它。
  • 如果你想在 [0,0,0,0] 上设置一个默认值,在某些情况下你可以覆盖它,你也可以这样做,但它有一个常见的问题 - 请参阅 docs.python-guide.org/writing/gotchas/…
  • 刚刚将bonus 预定义为def __init__(self,nm,pm,adss, bonus=[0,0,0,0]): 并将self._bonus = [0,0,0,0] 更改为self._bonus = bonus
  • @sahasrara62:坏主意。这是一个可变的默认参数错误。
  • 如@user2357112supportsMonica 所说,在参数定义中添加None,如果要将默认值保持为[0,0,0,0],则使用 if 语句, just predefined bonus` 作为def __init__(self,nm,pm,adss, bonus=None): 和将self._bonus = [0,0,0,0] 更改为self._bonus = bonus if bonus else [0,0,0,0]

标签: python list class oop object


【解决方案1】:

当前版本不起作用,因为您没有将该列表作为参数传递给初始化函数。您的 __init__ 函数需要如下所示:

def __init__(self,nm,pm,adss,bns):
    self._nom =  nm
    self._prenom = pm
    self._adresse = adss
    self._bonus = bns

然后初始化程序知道它应该期望第四个参数应用于_bonus 属性。

请注意,这只会在创建对象时设置属性。要在创建对象后更改它,您应该创建一个 setter 函数。

我不确定您是否希望将奖金的默认设置作为标准。如果是这样,请参阅有关您的问题的 cmets,了解如何执行此操作的详细信息。

【讨论】:

  • 我只是想在将对象列表添加到该类时为其设置新值。但似乎我需要创建一个集合。谢谢!
【解决方案2】:

您可以为bonus 参数提供一个不可变默认值,然后根据是否传递了一个值来分配给self._bonus

制作作为参数传递给对象的可变参数的副本通常是一种好习惯。

def __init__(self, nom, prenom, adresse, bonus=None):
    self._nom =  nom
    self._prenom = prenom
    self._adresse = adresse
    self._bonus = [] if bonus is None else bonus[:]  # make a copy of the mutable parameter

【讨论】:

    【解决方案3】:
    def __init__(self, nom, prenom, adresse, bonus=None):
        self._nom =  nom
        self._prenom = prenom
        self._adresse = adresse
        self._bonus = bonus if bonus else [0, 0, 0, 0]
    

    回答问题的原因:

    • 您不想将列表文字(其中之一:[])作为函数/方法调用的默认参数。这是大家都在谈论的不可变默认值错误。
    • bonus 参数的默认值设置为None,然后执行检查以查看是否传递了不同的值是可行的方法。
    • 检查bonus 参数值的最简洁方法如上所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2014-10-17
      • 2015-04-01
      • 2015-10-03
      相关资源
      最近更新 更多