Использование атрибута в качестве аргумента метода того же класса - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу определить атрибут класса и затем использовать его в качестве аргумента метода в том же классе следующим образом

class Class1:
    def __init__(self,attr):
        self.attr=attr
    def method1(self,x=self.attr):
        return 2*x


Возвращает ошибку: NameError: name 'self' is not defined

Как я могу определить метод таким образом, что всякий раз, когда я не пишу x явно, он просто использует атрибут attr?

В примере я имею в виду, что я хотел бы иметь

cl=Class1()
print cl.method1(12) # returns '24'
cl.attr= -2
print cl.method1() # returns '-4'

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Это потому, что в method1 вы просто определяете переменную self в первом аргументе. И переменная self будет использоваться только в теле функции. Вы, вероятно, думаете, что self является специальным ключевым словом. На самом деле self является просто ненормальной переменной, как и любая другая переменная.

Для решения проблемы: Используйте значение по умолчанию при определении функции и отметьте его в теле функции:

class Class1:
    def __init__(self):
        self.attr = 3

    def method1(self, x=None):
        x = self.attr if x is None else x
        return 2*x


cl = Class1()
print(cl.method1(12))
cl.attr=-2
print(cl.method1())

Результат:

24
-4
0 голосов
/ 29 апреля 2020

В вашем коде кажется, что вы называете x в качестве аргумента, передаваемого функции, когда в действительности вы присваиваете функции init значение, попробуйте следующий код:

class Class1:
    def __init__(self,attr = 3):
        self.attr=attr
    def method1(self):
        y = (self.attr)*(2)
        return y

Когда вы вызываете функцию, вы должны сделать это следующим образом:

result = Class1(4)
print(result.method1())

>>8

PT Я вроде нового в Python, поэтому не давайте мой ответ как должное или как будто это лучший способ чтобы решить вашу проблему.

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