如何允许__init__在python中允许1或没有参数

use*_*577 3 python class

现在我有这个班:

class foo():
  def __init__(self):
      self.l = []
Run Code Online (Sandbox Code Playgroud)

现在,我可以在参数中没有参数的情况下将变量设置为foo,因为它不需要参数,但是如何让它继续不需要参数,如果我想进入foo(),还可以放入列表?例:

>>> f = foo([1,2,3]) #would be legal and
>>> f = foo() # would be legal
Run Code Online (Sandbox Code Playgroud)

jam*_*lak 10

def __init__(self, items=None):
    if items is None: items = []
    self.l = items
Run Code Online (Sandbox Code Playgroud)

为了回应@Eastsun的编辑,我提出了一个不同的结构 __init__

def __init__(self, items=()):
    ''' Accepts any iterable 
    The appropriate TypeError will be raised if items is not iterable '''
    self.l = list(items)
Run Code Online (Sandbox Code Playgroud)

请注意,小写l是一个坏名称,它可能会混淆1


Eas*_*sun 6

def __init__(self, items=None):
    self.l = items or []
Run Code Online (Sandbox Code Playgroud)

要么

def __init__(self, items=None):
    self.l = items if items else []
Run Code Online (Sandbox Code Playgroud)

编辑以回应Dougal的评论. (我一直在学习Python大约两周,所以这里只是我的个人意见.如果我错了,请纠正我.)在像python这样的编程语言中,很难防止有人将不需要的对象传递给你的函数或方法.在我的想法中,确保__init__始终工作的安全方式是这样的:

def __init__(self, items = None):
    if isinstance(items, Iterable):
        self.l = list(items)
    elif items is None:
        self.l = []
    else:
        raise TypeError('items must be iterable')
Run Code Online (Sandbox Code Playgroud)

注意:如果items已经是列表,则上述方法始终生成浅表副本.

  • 我已经没有将任意对象转换为布尔值的习惯,因为它通常会导致numpy数组出现异常.当然,如果你不使用numpy这不是问题,但我通常更喜欢明确地检查`is None`. (2认同)