我正在尝试传递一个函数,它不接受任何输入并返回一些值。该函数在类中定义。但是,它会抛出以下错误:
NameError: name 'self' is not defined
请参阅以下示例代码:
class Test():
def rand(self):
return 4
def print_rand(self, num=self.rand()):
print num
t = Test()
print t.print_rand()
有任何解决方法吗?请注意,我在Ubuntu 14.04 LTS PC上使用Python 2.7。
答案 0 :(得分:3)
你不能这样做。
这是一件好事 - 因为默认是在功能创建(即,不是在它被调用时)进行评估的。如果确实有效,那么当程序首次加载此函数时会生成随机数,然后为每个调用保留相同的随机数。
这应该会给你你想要的效果;
def print_rand(self, num=None):
if num is None:
num = self.rand()
# ...
答案 1 :(得分:3)
使用self作为可选参数是不可能的,但定义静态属性是可行的。
http://allenbrowne.com/func-DAO.html#FieldTypeName
class Test(object):
rand = 4 # statically defined
def print_rand(self, num=rand):
print(num)
t = Test()
t.print_rand()
答案 2 :(得分:1)
如果你必须将num
定义为一种方法,那么@Shadow所说的是最好的方法,除非num
也可以传递None
的值。
另一个选择是简单地定义一个不自取的函数,只是将它作为正常函数在params中调用。
class Test():
def rand():
return 4
def print_rand(self, num=rand()):
print num
t = Test()
print t.print_rand()
如果您确实打算不访问实例中的任何内容,并且将返回一些常量值,则可以将其定义为@staticmethod。
总而言之,我不确定调用方法在函数参数声明中获取默认值的用例是什么。像@ Shadow的帖子所说的那样,对于一些不常见的事情说得好一些。它将来会为你和其他人节省一些时间。