Кроме того, Swiss Mister post, в моем случае window.open был запущен внутри обещания, который включил блокировку всплывающих окон, мое решение было: в угловом:
$scope.gotClick = function(){
var myNewTab = browserService.openNewTab();
someService.getUrl().then(
function(res){
browserService.updateLocation(res.url, myNewTab);
}
);
};
browserService:
this.openNewTab = function(){
var newTabWindow = $window.open();
return newTabWindow;
}
this.updateTabLocation = function(tabLocation, tab) {
if(!tabLocation){
tab.close();
}
tab.location.href = tabLocation;
}
так вы можете открыть новую вкладку с помощью ответа на обещание и не вызвать блокировщик всплывающих окон.
data.fn = staticmethod(myFunction)
должен добиться цели.
То, что можно сделать:
d = foo.data()
d.fn = myFunction
d.fn(1,2,3)
, Который не может быть точно, что Вы хотите, но действительно работает.
Это кажется бессмысленным мне. Почему не просто называют myFunction, когда Вам нужен он?
В целом, в Python, мы используем модули для этого вида пространства имен (контрастируйте это с Java, где у Вас просто нет выбора). И конечно, myFunction уже связывается с пространством имен модуля при определении его.
Благодаря Andre для ответа - настолько простой!
Для тех из Вас, кто заботится, возможно, я должен был включать весь контекст проблемы. Здесь это так или иначе:
В моем приложении, пользователи могут записать плагины в Python. Они должны определить функцию с четко определенным списком параметров, но я не хотел налагать любые соглашения о присвоении имен по ним.
Так, пока пользователи пишут функцию с корректным количеством параметров и типов, все, что они должны сделать, что-то вроде этого (помните, это - сменный код):
# this is my custom code - all plugins are called with a modified sys.path, so this
# imports some magic python code that defines the functions used below.
from specialPluginHelperModule import *
# define the function that does all the work in this plugin:
def mySpecialFn(paramA, paramB, paramC):
# do some work here with the parameters above:
pass
# set the above function:
setPluginFunction(mySpecialFn)
вызов к setPluginFunction
берет функциональный объект и устанавливает его в скрытом объекте класса (наряду с другим связанным со сменной конфигурацией материалом, этот пример был упрощен несколько). Когда главное приложение хочет выполнить функцию, я использую runpy
модуль, чтобы выполнить сменный код и затем извлечь упомянутый выше объект класса - это дает мне данные конфигурации и сменную функцию, таким образом, я могу выполнить его чисто (не загрязняя мое пространство имен).
Этот весь процесс повторяется многократно для различных плагинов по тому же входу и, кажется, работает очень хорошо на меня.