我的目标是为几个对象属性设置可变类型(列表)的默认值。根据here的讨论,我在__init__
的参数中将这些属性的默认值设置为None
,然后如果他们采用默认值,则将它们的值分配给[]
,其值为__init__
。这里有这样的代表:对象属性的可变类型默认值的迭代赋值
class Wat(object):
def __init__(self, arg1=None, arg2=None, arg3=None):
for arg in arg1, arg2, arg3:
if arg == None:
arg = []
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def give(self, thing):
self.arg1.append(thing)
self.arg2.append(thing)
self.arg3.append(thing)
wat = Wat()
wat.give(5)
但是,这将引发以下异常:
AttributeError: 'NoneType' object has no attribute 'append'
。
我看不出wat.arg1
,wat.arg2
和wat.arg3
仍然可以在时间wat.give(5)
型None
被称为 - 他们应该在__init__
被派到[]
。它必须是与我所编码的分配方式,因为这个工程:
class Wat(object):
def __init__(self, arg1=None, arg2=None, arg3=None):
if arg1 == None:
arg1 = []
if arg2 == None:
arg2 = []
if arg3 == None:
arg3 = []
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def give(self, thing):
self.arg1.append(thing)
self.arg2.append(thing)
self.arg3.append(thing)
wat = Wat()
wat.give(5)
在我看来,这两个语法相同的功能,但你能想象后者语法如何变得非常繁琐,不美观因为以这种方式分配的参数数量增加。
以前的语法有什么问题?我该如何解决它?谢谢。
编辑:你们几个已经确定了这个问题,但我仍然没有一个令人满意的解决方案。 @roippi提出了一种有效的方法来分配一个变量,但假设我有100个变量。我如何在最少的代码行中完成这项任务?这是循环的最初目的。谢谢你们。
你可以只做'self.arg1 = arg1如果arg1 else []'等等。跳过那个中间步骤。 – roippi
@roippi,考虑'如果arg1是None else []',否则条件不一样。 –
@kroolik如果你的类已经定义了多个falsy值的行为,当然。否则,我认为这种区别毫无意义。 – roippi