В 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
здесь как подмодулем, а не как классом.