У меня возникают некоторые проблемы с параметром self, а некоторые, казалось бы, непоследовательное поведение на Python раздражают меня, поэтому я считаю, что лучше спросить некоторых людей в курсе. У меня есть класс, Foo
. Этот класс будет иметь множество методов, m1
, до mN
. Для некоторых из них я буду использовать стандартное определение, как в случае m1
ниже. Но для других, более удобно просто назначить имя метода напрямую, как я сделал с m2
и m3
.Python и параметр self
import os
def myfun(x, y):
return x + y
class Foo():
def m1(self, y, z):
return y + z + 42
m2 = os.access
m3 = myfun
f = Foo()
print f.m1(1, 2)
print f.m2("/", os.R_OK)
print f.m3(3, 4)
Теперь я знаю, что os.access
не принимает self
параметр (на первый взгляд). И у этого до сих пор нет проблем с этим типом назначения. Однако я не могу сделать то же самое для своих собственных модулей (предположим, myfun
определено в mymodule.myfun
). Запуск выше код дает следующий результат:
3
True
Traceback (most recent call last):
File "foo.py", line 16, in <module>
print f.m3(3, 4)
TypeError: myfun() takes exactly 2 arguments (3 given)
Проблема заключается в том, что из-за рамки я работаю, я не могу не иметь класс Foo
по крайней мере. Но я бы хотел, чтобы у меня не было mymodule
вещей в фиктивном классе. Для того, чтобы сделать это, мне нужно сделать что-то аля
def m3(self,a1, a2):
return mymodule.myfun(a1,a2)
Что является чрезвычайно избыточно, если у вас есть как 20 из них. Итак, вопрос в том, как я могу сделать это совершенно другим и, очевидно, гораздо более умным способом, или как я могу заставить свои собственные модули вести себя как встроенные, поэтому он не жалуется на то, что слишком много получает один аргумент.
вашей общая точка имеет смысл, но я не вижу, как его отношение, является ли модуль написан на C, Python или Befunge –
Точки заключается в том, что он запускается как * собственный код *, динамически связанный с интерпретатором. Вы правы, однако, это может быть на любом компилированном языке. –
'staticmethod' заставляет все работать нормально. Но вещи не должны работать по-другому, когда встроенный или собственный код, или что-то вроде ИМО. Поэтому я предполагаю, что соглашусь на рабочий код, и понимание придет в какой-то другой момент. – Svend