5

现在我有这个类:

class foo():
  def __init__(self):
      self.l = []

现在,我可以在参数中不带参数的情况下将变量设置为 foo,因为它不带参数,但是我怎样才能允许它继续不带任何必需的参数,但如果我想放入 foo() ? 例子:

>>> f = foo([1,2,3]) #would be legal and
>>> f = foo() # would be legal
4

3 回答 3

12
def __init__(self, items=None):
    if items is None: items = []
    self.l = items

针对@Eastsun 的编辑,我提出了一个不同的结构__init__

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

请注意,小写l是一个坏名字,它可能会与1

于 2013-04-20T03:17:08.150 回答
7
def __init__(self, items=None):
    self.l = items or []

或者

def __init__(self, items=None):
    self.l = items if items else []

针对 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')

注意:如果 items 已经是一个列表,上述方法总是做一个浅拷贝。

于 2013-04-20T03:19:01.910 回答
-1
class foo():
  def __init__(self, items=[]):
      self.l = items
于 2013-04-20T03:30:16.363 回答