Дополнительные методы в Python

Вот работающая и эффективная функция массива Shisherle Fisher-Yates:

private static void shuffleArray(int[] array)
{
    int index;
    Random random = new Random();
    for (int i = array.length - 1; i > 0; i--)
    {
        index = random.nextInt(i + 1);
        if (index != i)
        {
            array[index] ^= array[i];
            array[i] ^= array[index];
            array[index] ^= array[i];
        }
    }
}

или

private static void shuffleArray(int[] array)
{
    int index, temp;
    Random random = new Random();
    for (int i = array.length - 1; i > 0; i--)
    {
        index = random.nextInt(i + 1);
        temp = array[index];
        array[index] = array[i];
        array[i] = temp;
    }
}
41
задан Torsten Marek 5 February 2009 в 10:54
поделиться

5 ответов

Можно добавить любые методы, которые Вы любите на объектах класса, определенных в коде Python (иначе исправление обезьяны):

>>> class A(object):
>>>     pass


>>> def stuff(self):
>>>     print self

>>> A.test = stuff
>>> A().test()

Это не работает над встроенными типами, потому что их __dict__ не перезаписываемо (это dictproxy).

Так не, в Python нет никакого "реального" дополнительного механизма метода.

52
ответ дан Eric 23 September 2019 в 15:28
поделиться

Другая опция состоит в том, чтобы переопределить метакласс. Это позволяет, Вы к, среди прочего, указываете функции, которые должны существовать во всех классах.

Эта статья начинает обсуждать это:

http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

0
ответ дан tsellon 23 September 2019 в 15:28
поделиться

У меня была большая удача с методом, описанным здесь:

http://mail.python.org/pipermail/python-dev/2008-January/076194.html

я понятия не имею, работает ли это над builtins все же.

1
ответ дан hernan43 23 September 2019 в 15:28
поделиться

не уверенный, если, что, что Вы спрашиваете, но можно расширить существующие типы и затем назвать то, что Вы любите на новой вещи:

class  int(int):
     def random_method(self):
           return 4                     # guaranteed to be random
v = int(5)                              # you'll have to instantiate all you variables like this
v.random_method()

class int(int):
    def xkcd(self):
        import antigravity
        print(42)

>>>v.xkcd()
Traceback (most recent call last):
  File "<pyshell#81>", line 1, in <module>
    v.xkcd()
AttributeError: 'int' object has no attribute 'xkcd'
c = int(1)
>>> c.random_method()
4
>>> c.xkcd()
42

надежда, которая разъясняет Ваш вопрос

9
ответ дан SilentGhost 23 September 2019 в 15:28
поделиться

Следующий менеджер по контексту добавляет, что метод как Запрещенный Fruid был бы без ограничений его. Помимо этого это обладает дополнительным преимуществом удаления дополнительного метода впоследствии:

class extension_method:

    def __init__(self, obj, method):
        method_name = method.__name__
        setattr(obj, method_name, method)
        self.obj = obj
        self.method_name = method_name

    def __enter__(self):
        return self.obj

    def __exit__(self, type, value, traceback):
        # remove this if you want to keep the extension method after context exit
        delattr(self.obj, self.method_name)

Использование следующие:

class C:
    pass

def get_class_name(self):
    return self.__class__.__name__

with extension_method(C, get_class_name):
    assert hasattr(C, 'get_class_name') # the method is added to C
    c = C()
    print(c.get_class_name()) # prints 'C'

assert not hasattr(C, 'get_class_name') # the method is gone from C
0
ответ дан 27 November 2019 в 00:42
поделиться
Другие вопросы по тегам:

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