Почему python говорит, что принимает 1 аргумент 2, когда я удаляю ключевое слово self? - PullRequest
0 голосов
/ 14 марта 2020

Мне любопытно, почему отладчик говорит, что show () принимает 1 аргумент 2, в то время как я являюсь единственным аргументом, и если я добавляю self в качестве параметра метода show (), тогда все в порядке. Пожалуйста, объясните это.

class Demo:
    def show(x):
        print("hello {0}".format(x))
o2 = Demo()
o2.show("world")

Вывод

  File "main.py", line 7, in <module>
    o2.show("ksr")
TypeError: show() takes exactly 1 argument (2 given)```

Ответы [ 3 ]

2 голосов
/ 14 марта 2020

Когда вы определяете методы внутри класса, вы должны включить обязательный первый аргумент, например, self перед аргументом x, например:

class Demo:
    def show(self, x):
        print("hello {0}".format(x))

self - это переменная, которая содержит ваш Экземпляр демонстрационного класса.

Ваш метод в настоящее время просто печатает x и не использует никаких переменных класса. Вы можете избежать использования self, сделав ваш метод stati c примерно так

class Demo:
    @staticmethod
    def show(x):
        print("hello {0}".format(x))

или преобразовав его в stati c позже, используя ключевое слово staticmethod перед вызовом метода, например

Demo.show = staticmethod(Demo.show)
o2 = Demo()
o2.show("world")

Первый вариант обычно предпочтителен.

1 голос
/ 14 марта 2020

Python немного отличается от других языков, когда дело касается функций класса.

Если вы определяете переменную внутри класса, это переменная stati c, которая принадлежит классу, как будто класс был объектом. Потому что класс является объектом. Это python Dict.

Когда вы создаете экземпляр класса, python копирует Dict и дает ему новое имя.

Для создания переменных экземпляра вам необходимо прикреплять их к экземпляру Dict, а не к классу Dict.

Чтобы избежать путаницы между этими двумя Dict python, введено ключевое слово «self». Когда python вызывает функцию в экземпляре Dict, он передает копию экземпляра Dict в функцию в качестве первого параметра.

Таким образом, чтобы изменить переменную внутри функции, вам необходимо сделать следующее:

class bicycle:
    numwheels = 2
    def __init__(self):
        # This is what python uses as the constructor
        self.numwheels = 3

    def changeInstanceWheels(self, wheelnum):
        self.numwheels = wheelnum
bike = bicycle()
print(bicycle.numwheels) # prints 2
print(bike.numwheels) # prints 3

bike.changeInstanceWheels(5)

print(bicycle.numwheels) # still prints 2 because this is the static variable
print(bike.numwheels) # prints 5
1 голос
/ 14 марта 2020

Экземпляр, для которого вы вызываете метод, неявно является первым аргументом (т. Е. self). Итак, здесь метод получает два аргумента - o2, который вызывается, и "ksr", который ему передается, и ошибки, потому что он ожидает только один аргумент.

...