Вот работающая и эффективная функция массива 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;
}
}
Можно добавить любые методы, которые Вы любите на объектах класса, определенных в коде Python (иначе исправление обезьяны):
>>> class A(object):
>>> pass
>>> def stuff(self):
>>> print self
>>> A.test = stuff
>>> A().test()
Это не работает над встроенными типами, потому что их __dict__
не перезаписываемо (это dictproxy
).
Так не, в Python нет никакого "реального" дополнительного механизма метода.
Другая опция состоит в том, чтобы переопределить метакласс. Это позволяет, Вы к, среди прочего, указываете функции, которые должны существовать во всех классах.
Эта статья начинает обсуждать это:
http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html
У меня была большая удача с методом, описанным здесь:
http://mail.python.org/pipermail/python-dev/2008-January/076194.html
я понятия не имею, работает ли это над builtins все же.
не уверенный, если, что, что Вы спрашиваете, но можно расширить существующие типы и затем назвать то, что Вы любите на новой вещи:
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
надежда, которая разъясняет Ваш вопрос
Следующий менеджер по контексту добавляет, что метод как Запрещенный 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