使用 传递参数的方法keyword *args или **kwargs
。作为这些关键字的实现示例,实现了该类Car
:
class Car():
def __init__(self, *args):
self.speed = args[0]
self.color = args[1]
audi = Car(200, 'red')
bmw = Car(250, 'black')
mb = Car(190, 'white')
print(audi.color)
print(bmw.speed)
我们可以看到,创建类的对象时Car
,参数被传递给方法__init__
,然后从数组中赋值args
。
问题:如果我们使用args
通常的参数列表来代替,是否会有显着差异或什么也不会发生?
UPD:根据答案和评论,我想到了使用这些的成功示例keywords
。基本上,将所有参数传递到一个堆中然后写入或处理它们会很方便。例如:
import logging
logging.basicConfig(filename='example.log',
level=logging.INFO)
def logger(func):
def log_func(*args):
logging.info(f'Running "{func.__name__}" with arguments {args}')
print(func(*args))
return log_func
def add(x, y):
return x+y
def sub(x, y):
return x-y
add_logger = logger(add)
sub_logger = logger(sub)
add_logger(3, 3)
add_logger(4, 5)
sub_logger(10, 5)
sub_logger(20, 10)
我们得到结果:
python .\ClosureFuntcionsPython.py
6
9
5
10
cat .\example.log
INFO:root:Running "add" with arguments (3, 3)
INFO:root:Running "add" with arguments (4, 5)
INFO:root:Running "sub" with arguments (10, 5)
INFO:root:Running "sub" with arguments (20, 10)
让我们看看如果我们不将预期的参数传递给类会发生什么。
您的类中将抛出异常
IndexError
,这将使使用该类变得混乱;在使用该类时,您必须记住每次该类期望将其视为输入,或者阅读该类的代码。这两种选择似乎都不切实际。并且,在类中使用位置参数,如果您忘记指定
speed
,color
则会抛出异常TypeError
,并且会清楚哪里做错了。此外,正如insolor如此恰当地指出的那样,无法提前知道需要传递给类的参数,这妨碍了类型的使用。这将使代码不可读且不适合进一步支持,无论是对于作者本人还是任何贡献者。