Может быть, немного пример кода поможет: Обратите внимание на разницу в сигнатурах вызова foo
, class_foo
и static_foo
:
class A(object):
def foo(self,x):
print "executing foo(%s,%s)"%(self,x)
@classmethod
def class_foo(cls,x):
print "executing class_foo(%s,%s)"%(cls,x)
@staticmethod
def static_foo(x):
print "executing static_foo(%s)"%x
a=A()
Ниже приведен обычный способ экземпляра объекта вызывает метод. Экземпляр объекта a
неявно передается как первый аргумент.
a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)
С помощью методов класса класс экземпляра объекта неявно передается как первый аргумент вместо self
.
a.class_foo(1)
# executing class_foo(,1)
Вы также можете вызвать class_foo
с помощью класса. Фактически, если вы определите что-то как метод класса, это, вероятно, потому, что вы намереваетесь называть его из класса, а не из экземпляра класса. A.foo(1)
поставил бы TypeError, но A.class_foo(1)
работает просто отлично:
A.class_foo(1)
# executing class_foo(,1)
. Одно из используемых людьми методов класса - это создание наследуемых альтернативных конструкторов .
С помощью staticmethods ни один self
(экземпляр объекта), ни cls
(класс) неявно передаются в качестве первого аргумента. Они ведут себя как простые функции, за исключением того, что вы можете вызвать их из экземпляра или класса:
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
Статические методы используются для группировки функций, которые имеют некоторое логическое соединение с классом класса.
foo
- это просто функция, но когда вы вызываете a.foo
, вы не просто получаете функцию, вы получаете «частично примененную» версию функции с экземпляром объекта a
, связанным как первый аргумент функции. foo
ожидает 2 аргумента, а a.foo
ожидает только 1 аргумент.
a
привязан к foo
. Это означает термин «связанный» ниже:
print(a.foo)
# >
С a.class_foo
, a
не привязан к class_foo
, а класс A
привязан к class_foo
].
print(a.class_foo)
# >
Здесь, с помощью метода static, хотя это метод, a.static_foo
просто возвращает хорошую функцию ole без привязки аргументов. static_foo
ожидает 1 аргумент, а a.static_foo
ожидает также 1 аргумент.
print(a.static_foo)
#
И, конечно же, то же самое происходит, когда вы вызываете static_foo
с классом A
.
print(A.static_foo)
#
Вы можете использовать py2exe , как уже было сказано, и использовать cython , чтобы преобразовать ваши файлы .py
в .pyc
, скомпилированные файлы C, например .dll
в Windows и .so
в Linux, гораздо труднее вернуться, чем обычные файлы .pyo
и .pyc
(а также повысить производительность!) [/ g2]
Использовать py2exe .... использовать ниже настроенные файлы:
from distutils.core import setup
import py2exe
from distutils.filelist import findall
import matplotlib
setup(
console=['PlotMemInfo.py'],
options={
'py2exe': {
'packages' : ['matplotlib'],
'dll_excludes': ['libgdk-win32-2.0-0.dll',
'libgobject-2.0-0.dll',
'libgdk_pixbuf-2.0-0.dll']
}
},
data_files = matplotlib.get_py2exe_datafiles()
)
py2exe сделает exe-файл, который вы хотите, но вам нужно иметь ту же версию MSVCR90.dll на машине, в которой вы собираетесь использовать свой новый exe. Дополнительную информацию см. В http://www.py2exe.org/index.cgi/Tutorial .
Возможно, вы захотите исследовать Nuitka . Он использует исходный код python и преобразует его в вызовы API C ++. Затем он компилируется в исполняемый двоичный файл (ELF в Linux). Он существует уже несколько лет и поддерживает широкий спектр версий Python.
Вы, вероятно, также получите повышение производительности, если будете использовать его. Рекомендуется.
Я хотел бы скомпилировать некоторую полезную информацию о создании автономных файлов в Windows с помощью Python 2.7.
Я использовал py2exe, и он работает, но у меня были некоторые проблемы.
Эта последняя причина заставила меня попробовать PyInstaller http: //www.pyinstaller. org / .
На мой взгляд, это намного лучше, потому что:
Я предлагаю создать файл .bat со следующими строками, например (pyinstaller.exe должен находиться в Пути Windows):
pyinstaller.exe --onefile MyCode.py
Итак, я думаю, что, по крайней мере, для python 2.7, лучшим и простым вариантом является PyInstaller. [/ g1 7]
Использовать Cython для преобразования в c, компиляции и ссылки с gcc. Другим может быть, сделать основные функции в c (те, которые вы хотите сделать сложными для обратного), скомпилировать их и использовать python boost для импорта скомпилированного кода (плюс вы получите гораздо более быстрое выполнение кода). затем используйте любой инструмент, упомянутый для распространения.
Не совсем упаковка кода python, но теперь есть и grumpy из google, который переводит код в Go. Он не поддерживает python C api, поэтому он может не работать для всех проектов.
Да, можно скомпилировать скрипты Python в автономный исполняемый файл.
PyInstaller можно использовать для преобразования программ Python в автономные исполняемые файлы под Windows, Linux, Mac OS X, FreeBSD, Solaris и AIX. Это один из рекомендуемых преобразователей.
py2exe преобразует скрипты Python в исполняемый только в платформе Windows.
Cython является статический компилятор для языка программирования Python и расширенного языка программирования Cython.
Для скриптов Python 3.2 единственным выбором является Cxfreeze. Создайте его из источников, иначе он не сработает.
Для python 2.x я предлагаю pyinstaller, поскольку он может упаковать программу python в один исполняемый файл, в отличие от CxFreeze, который выводит также библиотеки.
Вы можете найти список утилит распространения, перечисленных @ https://wiki.python.org/moin/DistributionUtilities .
Я использую bbfreeze , и он работает очень хорошо (но пока поддержка python 3).
И третий вариант - cx_Freeze
, который является кросс-платформенным.
Мне сказали, что PyRun, https://www.egenix.com/products/python/PyRun/ , также является опцией.
Используя pyinstaller, я нашел лучший метод, используя ярлык для .exe, а не создание --onefile
. В любом случае, возможно, есть некоторые файлы данных, и если вы используете приложение на основе сайта, ваша программа зависит от файлов html, js, css. Нет смысла перемещать все эти файлы где-то .. вместо этого, если мы переместим рабочий путь вверх.
Сделайте ярлык для exe, переместите его вверху и установите целевые и начальные пути, как указано, чтобы относительные пути переместились в dist \ folder:
Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe
Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\"
Можно переименовать ярлык на все, что переименовано в «GTFS-Manager». Теперь, когда я дважды щелкаю ярлык, это как если бы я python-запускал файл! Я нашел этот подход лучше, чем --onefile
в качестве:
О, не забудьте удалить из папки сборки после здание будет экономить на размере.
Вы можете использовать PyInstaller для упаковки программ Python в качестве автономных исполняемых файлов. Он работает на Windows, Linux и Mac.
PyInstaller Quickstart
Установить PyInstaller из PyPI:
pip install pyinstaller
Перейти в каталог вашей программы и run:
pyinstaller yourprogram.py
Это приведет к созданию пучка в подкаталоге, названном
blockquote>dist
.
вам может понравиться py2exe . вы также найдете там информацию о том, как это сделать на linux
Я также рекомендую pyinstaller для лучшей обратной совместимости, такой как python 2.3 - 2.7. для py2exe у вас должен быть python 2.6