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没有在类中全局设置?
答案 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"
...