Python: обычный метод и статический метод с тем же именемPython

Программы на Python
Ответить
Anonymous
 Python: обычный метод и статический метод с тем же именем

Сообщение Anonymous »

Введение

У меня есть класс Python, который содержит ряд методов. Я хочу, чтобы у одного из этих методов был статический аналог, то есть статический метод с тем же именем, который мог бы обрабатывать больше аргументов. После некоторых поисков я обнаружил, что могу использовать декоратор @staticmethod для создания статического метода.

Проблема
Для удобства я создал сокращенный тестовый пример, воспроизводящий проблему:

Код: Выделить всё

class myclass:

@staticmethod
def foo():
return 'static method'

def foo(self):
return 'public method'

obj = myclass()
print(obj.foo())
print(myclass.foo())
Я ожидаю, что приведенный выше код выведет следующее:

Код: Выделить всё

public method
static method
Однако код печатает следующее:

Код: Выделить всё

public method
Traceback (most recent call last):
File "sandbox.py", line 14, in 
print(myclass.foo())
TypeError: foo() missing 1 required positional argument: 'self'
Из этого я могу только предположить, что вызов myclass.foo() пытается вызвать его нестатический аналог без аргументов (что не будет работать поскольку нестатические методы всегда принимают аргумент self). Такое поведение меня сбивает с толку, поскольку я ожидаю, что любой вызов статического метода фактически вызовет статический метод.

Я тестировал эту проблему в оба Python 2.7 и 3.3, но получают одну и ту же ошибку.

Вопросы

Почему это происходит и что я могу сделать, чтобы исправить свой код, чтобы он принты:

Код: Выделить всё

public method
static method
как я и ожидал?

Подробнее здесь: https://stackoverflow.com/questions/205 ... -same-name
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»