-3

这里有很多关于这类问题的讨论,但我没有看到任何关于如何实现这样的功能。

假设我有一个里面Foo()有一个函数的类bar()

该函数不bar()接受或只接受一个参数。当它不接受任何内容时,该属性设置为 2。否则,它设置为输入的任何内容。IE

In [32]: foo = Foo()
In [33]: foo.bar()
In [34]: foo.a
Out [34]: 2

In [32]: foo = Foo()
In [33]: foo.bar(5)
In [34]: foo.a
Out [34]: 5

我该怎么做呢?

4

2 回答 2

6

添加关键字参数

def bar(self, value=2):
    self.a = value

如果没有明确给出,这里value默认为:2

>>> foo = Foo()
>>> foo.bar()
>>> foo.a
2
>>> foo.bar(5)
>>> foo.a
5

请注意,函数签名创建一次;默认值存储在函数对象上。一个常见的错误是假设每次调用函数时都会评估默认值,这可能会导致一些意外:

import datetime

def ham(now=datetime.datetime.now()):
    print now

这里now将固定到bar导入和 Python 创建函数对象的那一刻:

>>> ham()
2013-10-24 10:20:26.024775
>>> # wait some time
...
>>> ham()
2013-10-24 10:20:26.024775

当默认值是可变的时,它变得更加令人惊讶:

def eggs(param, value=[]):
    value.append(param)
    print value

重复调用eggs(2)将导致value列表增长,2每次调用时都会在列表中添加一个新值:

>>> eggs(2)
[2]
>>> eggs(2)
[2, 2]
>>> eggs(2)
[2, 2, 2]

有关此问题的详细讨论,请参阅“Least Astonishment”和 Mutable Default Argument

于 2013-10-24T09:04:55.070 回答
0

可以给参数一个默认值。只需将其定义为关键字参数:

def bar(self, param=2):
    self.a = param

希望这可以帮助!

于 2013-10-24T09:05:00.173 回答