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中成员函数的默认值
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中成员函数的默认值
你是对的,你不能这样做。
例如,在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"
时的默认值进行评估时发生错误。这种情况发生在类被定义的时候(而不是当方法被调用时)。在那个时候,self
没有意义。解决这个问题
一种方式是像这样:
...
def foo2(self,aa=None):
if aa is None:
aa = self.A
return "la"
...
关键字参数,如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]