将函数传递给Python

时间:2017-11-17 03:51:54

标签: python

我正在尝试传递一个函数,它不接受任何输入并返回一些值。该函数在类中定义。但是,它会抛出以下错误:

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。

3 个答案:

答案 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的帖子所说的那样,对于一些不常见的事情说得好一些。它将来会为你和其他人节省一些时间。