Я хотел немного уточнить ответ безжизненным , потому что, когда я начал читать о том, как использовать super () в иерархии множественного наследования в Python, я не получил его немедленно.
Что вам нужно понять, так это то, что super(MyClass, self).__init__()
предоставляет следующий метод next __init__
в соответствии с используемым алгоритмом упорядочивания разрешения метода (MRO) в контексте полного наследования иерархия .
Эта последняя часть имеет решающее значение для понимания. Рассмотрим снова пример:
class First(object):
def __init__(self):
super(First, self).__init__()
print "first"
class Second(object):
def __init__(self):
super(Second, self).__init__()
print "second"
class Third(First, Second):
def __init__(self):
super(Third, self).__init__()
print "that's it"
В соответствии с этой статьей о порядке разрешения метода Гвидо ван Россума вычисляется порядок разрешения __init__
(до Python 2.3) используя «перекос по левому краю по глубине»:
Third --> First --> object --> Second --> object
После удаления всех дубликатов, кроме последнего, получаем:
Third --> First --> Second --> object
Итак, позволяет следить за тем, что происходит, когда мы создаем экземпляр класса Third
, например x = Third()
.
__init__
третьего вызывается первым. __init__
super(Third,
self).__init__()
разрешается __init__
метод First, который вызывается. __init__
Первого super(First, self).__init__()
вызывает __init__
из Во-вторых, потому что это то, что диктует MRO! __init__
of Second super(Second, self).__init__()
вызывает __init__
объекта, что ничего не значит. После этого будет напечатан «второй». super(First, self).__init__()
будет напечатан «первый». super(Third, self).__init__()
будет напечатан «это все». Это объясняет, почему создание экземпляра Third () приводит к:
>>> x = Third()
second
first
that's it
. Алгоритм MRO был улучшен с Python 2.3, чтобы хорошо работать в сложных случаях, но я думаю что использование «перемотки по глубине слева направо» + «удаление дубликатов ожидается для последнего» все еще работает в большинстве случаев (прокомментируйте, если это не так). Обязательно прочитайте сообщение в блоге Guido!
Я только что заставил это работать без установки VS2010, выполнив следующие шаги на сервере сборки:
Это, кажется, работает для меня
На сервере сборки должен быть установлен .Net 4.0. При установке .Net 4.0 будет установлен новый MSBuild 4.0, который поддерживает упаковку проектов веб-приложений.
Кроме того, когда вы запускаете msbuild.exe, убедитесь, что вы используете тот, который находится в папке .Net 4.0 framework.
Для решения этой проблемы установите Visual Studio 2010 на сервере сборки и убедитесь, что вы установили Visual Web Developer
характерная черта.