python中成员函数的默认值

时间:2011-10-26 14:41:07

标签: python

class foo():
    def __init__(self,a):
        self.A=a

    def foo2(self,aa=self.A):
        return "la"
    @classmethod
    def test(cls):
        d=foo()
        d.foo2()

成员函数foo2找不到self.A和A.是不是因为A没有在类中全局设置?

3 个答案:

答案 0 :(得分:4)

关键字参数(例如aa)不能采用self的默认值。当方法定义时,不会在调用方法时评估关键字参数。通常,通过将aa的默认值设置为None,您可以实现您的目标:

class foo():
    def __init__(self, a):
        self.A = a
    def foo2(self, aa=None):
        if aa is None:
            aa = self.A
        return 'la'

另请注意,由于关键字参数默认值是在定义而非执行时计算的,因此foo2所有调用都会共享其默认参数,即使从foo的不同实例调用也是如此。在使用诸如以下方法时,这通常会让新的Python程序员兴奋不已。

def footoo(a=list()):
    a.append(1)
    return a

对footoo的所有调用都将获得相同的列表对象;每次通话都不是新的。因此,反复调用footoo将导致以下结果:

>>> footoo()
[1]
>>> footoo()
[1, 1]
>>> footoo()
[1, 1, 1]

答案 1 :(得分:0)

你是对的,你做不到。

例如,在Python中,你必须非常小心,因为它将反复使用相同的列表(在这种情况下,它将继续附加到同一列表):

def foo2(self,aa=[]):
    aa.append('foo')
    return "la"

相反,一种非常常见的方法是将None指定为默认值,然后使用if语句将其设置在函数内:

def foo2(self,aa=None):
    if not aa:
       aa = self.A
    return "la"

答案 2 :(得分:0)

评估默认值时发生错误。在定义类时(而不是在调用方法时)会发生这种情况。在那个时间点,self没有意义。

解决此问题的一种方法是:

    ...
    def foo2(self,aa=None):
        if aa is None:
            aa = self.A
        return "la"
    ...