Сам очень долго не мог понять, но сейчас стал немного понимать, хотя наверное и не до конца. Может кому-то мое объяснение поможет.
Вот код с leetcode к
вот этой задаче:
Там нужно сложить два числа, записанные в строках, без всяких int и выдать результат также в str.
class Solution(object):
def addStrings(self, num1, num2):
len1 = len (num1)
len2 = len (num2)
z1 = 0
z2 = 0
for i in range(len1):
last1 = ord(num1[i]) - 48
next1 = z1 * 10
z1 = last1 + next1
for i in range(len2):
last2 = ord(num2[i]) - 48
next2 = z2 * 10
z2 = last2 + next2
return str(z1 + z2)
Дальше вызываем его с разными данными
p = Solution()
print(p.addStrings('192','312')) # 504
print(p.addStrings('193','312')) # 505
print(p.addStrings('001','100')) # 101
Т.е. "p" как был встала после "p = Solution()" на место "self", а после этого уже можно подставлять разные данные и получать результат.
А что, если попытаться обратиться к классу напрямую, не создавая объекта p (который стал self'ом) ? Это глупо и неправильно, но попробуем.
print (Solution.addStrings('32','532'))
И получаем ошибку:
TypeError: Solution.addStrings() missing 1 required positional argument: 'num2'
Пайтон посчитал первое значение - "33" как название объекта (мы же класс создали, а в нем должен быть объект!) , второе значение "532" как первое значение внутренней функции addStrings и говорит - а где второе-то значение???
Если опять же протупить и сделать все неправильно не создавая объект, то можно все же получить результат
print (Solution.addStrings('p2','111','111'))
Выдаст нам правильный результат - "222", но объект с именем "p2"
не был создан.
Если мы запросим после этого тип "p" и "p2", то получим такой ответ
print (type(p))
#<class '__main__.Solution'>
print (type(p2))
NameError: name 'p2' is not defined