Это подробно описано с достаточным количеством подробностей самим Гвидо в его сообщении в блоге Order Resolution (включая две предыдущие попытки).
В вашем примере Third()
вызовет First.__init__
. Python ищет каждый атрибут в родителях класса, поскольку они перечислены слева направо. В этом случае мы ищем __init__
. Итак, если вы определите
class Third(First, Second):
...
, Python начнет с просмотра First
, и, если First
не имеет атрибута, тогда он будет смотреть на Second
.
Эта ситуация становится более сложной, когда наследование начинает пересекать пути (например, если First
унаследовано от Second
). Прочтите ссылку выше для более подробной информации, но, в двух словах, Python попытается сохранить порядок, в котором каждый класс появится в списке наследования, начиная с самого дочернего класса.
Так, например, если у вас есть:
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First):
def __init__(self):
print "third"
class Fourth(Second, Third):
def __init__(self):
super(Fourth, self).__init__()
print "that's it"
, MRO будет [Fourth, Second, Third, First].
. Кстати: если Python не может найти порядок согласованного метода, он вызовет исключение, вместо этого о возврате к поведению, которое может удивить пользователя.
Отредактировано, чтобы добавить пример двусмысленного MRO:
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
print "third"
Если MF Third
будет [First, Second]
или [Second, First]
? Нет очевидного ожидания, и Python вызовет ошибку:
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution order (MRO) for bases Second, First
Редактирование: я вижу, что несколько человек утверждают, что в приведенных выше примерах нет вызовов super()
, поэтому позвольте мне объяснить: точка примеров чтобы показать, как строится MRO. Они не предназначены для печати «first\nsecond \ third» или что-то еще. Вы можете - и должны, конечно, поиграть с примером, добавить super()
звонки, посмотреть, что произойдет, и получить более глубокое понимание модели наследования Python. Но моя цель состоит в том, чтобы держать его простым и показать, как строится MRO. И он построен, как я объяснил:
>>> Fourth.__mro__
(,
, ,
,
)
openDevTools
в основном является функцией webContents
(при использовании на BrowserWindow
перенаправляется только )
, так что вы можете открыть devtools главного окно с
win.webContents.openDevTools()
И для BrowserView
с
view.webContents.openDevTools()
Или просто создайте представление с опцией devTools
, чтобы включить его по умолчанию
view = new BrowserView({ webPreferences: { devTools: true } }