现在我有这个班:
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
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已经是列表,则上述方法始终生成浅表副本.