Python: функции в области видимости класса - PullRequest
2 голосов
/ 26 ноября 2011

Я просто играю с языком, но задаюсь вопросом, возможно ли использовать функции, определенные в области видимости класса, без явного определения self в качестве первого аргумента.

Я понимаю, что "правильный" способ реализации класса может быть

class minimal:
    variable = 1    
    def add(self,x,y):
        return x+y
    def __init__(self,x):
        self.value = self.add(x,self.variable)

m = minimal(1)
print m.value
--> 2

Однако, если я определяю и применяю add аналогично variable (в области действия класса), то я получаю ошибку (ожидаемо):

class minimal:
    variable = 1
    def add(x,y):
        return x+y
    def __init__(self,x):
        self.value = self.add(x,self.variable)

m = minimal(1)
print m.value
--> TypeError: add() takes exactly 2 arguments (3 given)

Есть ли способ обойти это? Или это обычно рекомендуется, чтобы все было определено с явной ссылкой на self (т.е. self.variable=1, определенный в методе __init__ и add, определенный с self в качестве первого аргумента)?

Правка __init__ Исправлен метод присвоения self.value во втором случае вместо попытки вернуть значение (непреднамеренное).

Ответы [ 3 ]

4 голосов
/ 26 ноября 2011

Имя первого аргумента является произвольным.Объект всегда передается в качестве первого аргумента.Когда вы объявляете add, объект будет передан как x.Когда вы вызываете self.add(x,self.variable), self привязывается к x в добавлении, x в __init__ привязывается к y в add и self.variable передается в качестве третьего аргумента, который add не объявлено, чтобы взять.

class minimal:
    variable = 1
    def add(x,y, *args):
        print('x: %s;\ny: %d;\nargs: %s;\n' % (x, y, args))
    def __init__(self,x):
        self.add(x,self.variable)
>>> minimal(2)
x: <__main__.minimal object at 0x1006e6e90>;
y: 2;
args: (1,);

В итоге, даже если вы покончили с self в качестве первого аргумента, вы все равно получите объект, переданный в качестве первого аргумента в методы.

4 голосов
/ 26 ноября 2011

Да , но не .

1 голос
/ 26 ноября 2011

Вы можете пометить метод как статический, попробуйте это:

class minimal:
  variable = 1

  @staticmethod
  def add(x,y):
    return x+y

  def __init__(self,x):
    print self.add(x,self.variable)

m = minimal(1)

Хотя я изменил это, чтобы ваш init метод не возвращал значение, которое он не должен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...