вызов метода Python внутри метода - PullRequest
0 голосов
/ 12 июня 2018

Вот мой код, который работает.

class S:
    def doSomething():
        for j in headers:
             for z in j:
                 st = str(z).strip()
                 stringValue = st.replace('\n', "")
                 headerArr.append(stringValue)

         return headerArr

Я хотел бы заменить приведенный выше код на этот.

class S:
    def cleanStr(self, stringVal):
        st = stringVal.strip()
        stringValue = st.replace('\n', "")
        return stringValue

    def doSomething():
        for j in headers:
            for z in j:
                newString = self.cleanStr(z)
                headerArr.append(newString)

        return headerArr

Но когда я пытаюсь запустить этот новый код, я получаю имя 'self' не определено.Заранее прошу прощения за любые ошибки с отступами.В другом файле у меня есть что-то вроде newArr = s.doSomething (). Он работает с первым фрагментом кода.Но не со вторым. Я попытался сделать def doSomething (self): а затем в другом файле я делаю newArr = s.doSomething (self), но я все еще получаю ту же ошибку.

1 Ответ

0 голосов
/ 12 июня 2018

В Python методы получают параметр self, только если вы явно его объявили.Вы уже сделали это для cleanStr;вам просто нужно сделать то же самое для doSomething:

class Spam:
    def cleanStr(self, stringVal):
        st = stringVal.strip()
        stringValue = st.replace('\n', "")
        return stringValue

    def doSomething(self):
        for j in headers:
            for z in j:
                newString = self.cleanStr(z)
                headerArr.append(newString)

Теперь self определено как параметр, поэтому вы можете использовать его для вызова self.cleanStr без получения NameError.

Стоит отметить, что, как написано, этот код будет работать, только если headers и headerArr являются глобальными переменными где-то еще в вашем коде.

Кроме того, это означает, что вы можете вызывать толькоdoSomething в экземпляре Spam:

headers = [('abc', 'def\n', '\ng\nh\ni\n'), ('abc', 'def')]
headerArr = []
spam = Spam()
spam.doSomething()
assert headerArr == ['abc', 'def', 'ghi', 'abc', 'def']

Вы можете увидеть это на repl.it .


Это очень странный интерфейс,У вас есть два метода для Spam, которые на самом деле ничего не делают с self, но вместо этого читают из некоторой глобальной последовательности и добавляют в некоторый глобальный список.Я не могу представить, где это было бы полезно.Но если вы все равно хотите это сделать, вы можете;вам просто нужно правильно разобраться в деталях.

Если вы хотите получить представление о том, как выглядит на самом деле использование класса, и, следовательно, стоить иметь класс и методы вместо набора просто отдельных функций,может быть что-то вроде этого:

class Spam:
    def __init__(self):
        self.headerArr = []

    def cleanStr(self, stringVal):
        st = stringVal.strip()
        stringValue = st.replace('\n', "")
        return stringValue

    def doSomething(self, headers):
        for j in headers:
            for z in j:
                newString = self.cleanStr(z)
                self.headerArr.append(newString)

spam = Spam()
spam.doSomething([('abc', 'def\n', '\ng\nh\ni\n'), ('abc', 'def')])
spam.doSomething([('abc\n', 'def\n')])
assert spam.headerArr == ['abc', 'def', 'ghi', 'abc', 'def', 'abc', 'def']

Ваша "версия, которая работает" на самом деле не работает, кроме как случайно:

class S:
    def doSomething():
        for j in headers:
             for z in j:
                 st = str(z).strip()
                 stringValue = st.replace('\n', "")
                 headerArr.append(stringValue)

Вы не можете вызвать это наэкземпляр S, или вы получите TypeError: doSomething() missing 1 required positional argument: 'headers'.Вы можете назвать его просто S.doSomething(), но только потому, что в Python 3 используются простые функциональные объекты для несвязанных методов, что означает, что, пока вы никогда не создаете экземпляр, вы можете использовать егокак статические методы.Но это не разумно.Если вы действительно хотите статический метод, объявите его с помощью @staticmethod.Но обычно вы этого не делаете;Вы просто хотите функцию в области видимости модуля.Вы фактически злоупотребляете S здесь как подмодулем, а не как классом.

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