#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()
Функция memberfunction foo2 не может найти self.Ни А , ни А. Это потому, что A не задано глобально внутри класса?
Ответ №1:
Аргументы ключевого слова, такие как aa
, не могут принимать значение по умолчанию from 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]
Ответ №2:
Вы правы, вы не можете этого сделать.
Например, в 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"
Ответ №3:
Ошибка возникает при вычислении значения по умолчанию. Это происходит при определении класса (а не при вызове метода). На данный момент self
это не имеет никакого значения.
Один из способов исправить это так:
...
def foo2(self,aa=None):
if aa is None:
aa = self.A
return "la"
...