Атрибуты функции Python - использование и [закрытые] злоупотребления

Я не верю, что для этого есть очень хорошая поддержка, но вы можете попробовать что-то вроде

import matplotlib.pyplot
from numpy import arange
from numpy import meshgrid

delta = 0.025
xrange = arange(-5.0, 20.0, delta)
yrange = arange(-5.0, 20.0, delta)
X, Y = meshgrid(xrange,yrange)

# F is one side of the equation, G is the other
F = Y**X
G = X**Y

matplotlib.pyplot.contour(X, Y, (F - G), [0])
matplotlib.pyplot.show()

См. API docs для contour: если четвертый Аргумент - это последовательность, затем он указывает, какие контурные линии будут отображаться. Но сюжет будет только так хорош, как разрешение ваших диапазонов, и есть определенные возможности, которые он может никогда не получить правильно, часто в точках самопересечения.

179
задан Eli Bendersky 3 December 2008 в 17:56
поделиться

7 ответов

Я обычно использую функциональные атрибуты в качестве устройства хранения данных для аннотаций. Предположим, что я хочу записать в стиле C# (указание, что определенный метод должен быть частью интерфейса веб-сервиса)

class Foo(WebService):
    @webmethod
    def bar(self, arg1, arg2):
         ...

тогда, я могу определить

def webmethod(func):
    func.is_webmethod = True
    return func

Затем когда вызов веб-сервиса прибывает, я ищу метод, проверяю, имеет ли базовая функция атрибут is_webmethod (фактическое значение не важно), и откажитесь от сервиса, если метод отсутствует или не предназначенный, чтобы быть вызванным сеть.

142
ответ дан Martin v. Löwis 4 November 2019 в 15:52
поделиться

Я использовал их в качестве статических переменных для функции. Например, учитывая следующий код C:

int fn(int i)
{
    static f = 1;
    f += i;
    return f;
}

я могу реализовать функцию так же в Python:

def fn(i):
    fn.f += i
    return fn.f
fn.f = 1

Это определенно попало бы в конец "злоупотреблений" спектра.

118
ответ дан mipadi 4 November 2019 в 15:52
поделиться

Функциональные атрибуты могут использоваться для записи легких закрытий, которые обертывают код и связанные данные вместе:

#!/usr/bin/env python

SW_DELTA = 0
SW_MARK  = 1
SW_BASE  = 2

def stopwatch():
   import time

   def _sw( action = SW_DELTA ):

      if action == SW_DELTA:
         return time.time() - _sw._time

      elif action == SW_MARK:
         _sw._time = time.time()
         return _sw._time

      elif action == SW_BASE:
         return _sw._time

      else:
         raise NotImplementedError

   _sw._time = time.time() # time of creation

   return _sw

# test code
sw=stopwatch()
sw2=stopwatch()
import os
os.system("sleep 1")
print sw() # defaults to "SW_DELTA"
sw( SW_MARK )
os.system("sleep 2")
print sw()
print sw2()

1.00934004784

2.00644397736

3.01593494415

10
ответ дан Kevin Little 4 November 2019 в 15:52
поделиться

Можно сделать, возражает JavaScript путь... Это не имеет никакого смысла, но это работает;)

>>> def FakeObject():
...   def test():
...     print "foo"
...   FakeObject.test = test
...   return FakeObject
>>> x = FakeObject()
>>> x.test()
foo
50
ответ дан defnull 4 November 2019 в 15:52
поделиться

Иногда я уже использую атрибут функции для кэширования вычисленных значений. У Вас может также быть универсальный декоратор, который обобщает этот подход. Знайте о проблемах параллелизма и побочных эффектах таких функций!

4
ответ дан 4 November 2019 в 15:52
поделиться

Я всегда имел предположение, что единственная причина, это было возможно, состояла в том, таким образом, было логическое место для помещения строки документа или другого такого материала. Я знаю, использовал ли я его для какого-либо производственного кода, это перепутало бы больше всего, кто считал его.

1
ответ дан Dale Reidy 4 November 2019 в 15:52
поделиться

Я использую их редко, но они могут быть довольно удобными:

def log(msg):
   log.logfile.write(msg)

Теперь я могу использовать log во всем моем модуле и перенаправлять вывод, просто установив log .logfile . Есть много-много других способов добиться этого, но этот легкий и очень простой. И хотя в первый раз это было забавно пахнуть, я пришел к выводу, что это пахнет лучше, чем наличие переменной глобального файла журнала .

14
ответ дан 23 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: