Python 3:在__init__中设置一个设置self属性的命令需要使用“self”吗?

时间:2012-11-15 14:56:20

标签: python parameter-passing self default-parameters

我知道问题标题听起来很奇怪,但由于英语不是我的第一语言,我觉得很难形式化。但是,我可以用更多的文字来解释它。

问题是,我正在尝试创建一个名为“Foo”的类。

# ../myProject/Foo.py

class Foo:
    '''Represents an example class for stackoverflow'''

现在所有的Foo类'实例都有function属性,它只保存一个可以通过实例执行的函数。此外,还有一个parameters属性,一个元组或一个列表,它保存了function被调用时应该使用的参数。

    def __init__(self, function, parameters):
        self.function = function
        self.parameters = parameters

    def callFunction(self):
        if self.function:
            self.function(*self.parameters)

这似乎工作正常,但问题是,我想给它一个默认值,来改变实例的属性。我基本上想做以下事情:

def __init__(self, function=setattr, \
        parameters=(self, "togglableAttribute", not self.togglableAttribute)):

这样做会引发NameError: name 'self' is not defined。我应该如何实现它以使其工作,或者我应该提出一个解决方法?

1 个答案:

答案 0 :(得分:1)

self是用于描述实例的典型变量名称。但是,在创建函数时(在类创建时)会计算默认参数。当然self尚不存在,因为该类尚未存在 - 该类仍处于构建过程中。

执行此操作的典型方法是检查哨兵;

def __init__(self, function=setattr, parameters=None):
    if parameters is None:
       parameters = (self, "togglableAttribute", not self.togglableAttribute)

请参阅我的回答here(及其下面的评论),讨论您可以用作哨兵的各种对象以及每种对象的各种优缺点。