2011-10-26 74 views
2
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在类中没有全局设置?python中成员函数的默认值

回答

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" 
0

时的默认值进行评估时发生错误。这种情况发生在类被定义的时候(而不是当方法被调用时)。在那个时候,self没有意义。解决这个问题

一种方式是像这样:

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

关键字参数,如aa,不能采取从self默认值。当方法是定义为时,关键字参数会被评估,而不是在调用时。通常人们会实现你想要什么设置的aaNone默认:

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]