заменяя «новый» модуль

У меня есть код, который содержит в себе следующие две строки:

instanceMethod = new.instancemethod(testFunc, None, TestCase) setattr(TestCase, testName, instanceMethod) 

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

5 Solutions collect form web for “заменяя «новый» модуль”

Существует дискуссия о том, что в python 3 это не требуется. То же самое работает в Python 2.6

Видеть:

 >>> class C: pass ... >>> c=C() >>> def f(self): pass ... >>> cf = f.__get__(c, C) >>> cf <bound method Cf of <__main__.C instance at 0x10042efc8>> >>> cf <unbound method Cf> >>> 

Повторяя вопрос для каждой выгоды, включая мою.

Есть ли замена в Python3 для new.instancemethod? То есть, учитывая произвольный экземпляр (а не его класс), как я могу добавить новую соответствующую функцию в качестве метода для нее?

Поэтому следующее достаточно:

 TestCase.testFunc = testFunc.__get__(None, TestCase) 

Вы можете заменить «new.instancemethod» на «types.MethodType»:

 from types import MethodType as instancemethod class Foo: def __init__(self): print 'I am ', id(self) def bar(self): print 'hi', id(self) foo = Foo() # prints 'I am <instance id>' mm = instancemethod(bar, foo) # automatically uses foo.__class__ mm() # prints 'I have been bound to <same instance id>' foo.mm # traceback because no 'field' created in foo to hold ref to mm foo.mm = mm # create ref to bound method in foo foo.mm() # prints 'I have been bound to <same instance id>' 

Проверьте эту тему (обновлено: исходный сайт удален).

Это сделает то же самое:

 >>> Testcase.testName = testFunc 

Да, это действительно так просто.

Ваша линия

 >>> instanceMethod = new.instancemethod(testFunc, None, TestCase) 

На практике (хотя и не теоретически) есть noop. 🙂 Вы могли бы так же хорошо

 >>> instanceMethod = testFunc 

Фактически, в Python 3 я уверен, что это будет так же и в теории, но новый модуль исчез, поэтому я не могу проверить его на практике.

Чтобы подтвердить, что нет необходимости использовать new.instancemthod () вообще с Python v2.4, вот пример того, как заменить метод экземпляра. Также не нужно использовать дескрипторы (хотя это работает).

 class Ham(object): def spam(self): pass h = Ham() def fake_spam(): h._spam = True h.spam = fake_spam h.spam() # h._spam should be True now. 

Удобен для модульного тестирования.

  • Как проверить код асинхронного кода Python 3.4?
  • Как отправить новую команду в подпроцесс
  • Передача параметра в конструктор базового класса или использование переменной экземпляра?
  • Как найти максимальный продукт двух элементов в списке?
  • Есть ли способ использовать super () для вызова метода __init__ каждого базового класса в Python?
  • Создание вращающейся трехмерной земли
  • Смутно о выборе между Python 2 и Python 3
  • Почему текстовый ввод-вывод должен быть буферизирован в python 3?
  • Python - лучший язык программирования в мире.