Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Brython:从单独的python文件调用对象的方法_Javascript_Python_Brython - Fatal编程技术网

Javascript Brython:从单独的python文件调用对象的方法

Javascript Brython:从单独的python文件调用对象的方法,javascript,python,brython,Javascript,Python,Brython,我对Brython框架很陌生,所以我的问题将是一个基本的问题。对此表示歉意 这是我的脚本“log.py”: 和html格式: <script src = "https://cdnjs.cloudflare.com/ajax/libs/brython/3.3.20/brython_stdlib.js"></script> <script src = "log.py" type = "text/python"></scrip

我对Brython框架很陌生,所以我的问题将是一个基本的问题。对此表示歉意

这是我的脚本“log.py”:

和html格式:

        <script src = "https://cdnjs.cloudflare.com/ajax/libs/brython/3.3.20/brython_stdlib.js"></script>

        <script src = "log.py" type = "text/python"></script>
        <script>
             //some javascript code
        </script>

//一些javascript代码
现在,在我的javascript中,我想调用对数类的log()函数。有人能告诉我如何才能做到这一点吗


提前感谢:-)

Brython允许您直接在浏览器中编写Python,但这意味着您必须知道自己在Python方面做了什么。您的代码段在语法上不正确。当我们修正语法时,我们必须修正它,使其具有一定的意义-(因此,如果在类构造时将x和y作为对数操作数和基数,那么在使用日志时,就不希望再次出现这种情况)

然后,当我们修复它时,您必须修复html部分,以便它能够正确地使用Brython。然后你就可以随心所欲了。始终查看Javascript控制台输出(ctrl+F12)-Brython可以在加载后生成一些有用的回溯,告知Python代码中的错误

然后,您必须记住,尽管Brython的作者已经通过下面的规定使从普通Javascript调用Python函数变得几乎透明,但对于您尝试使用的类和方法来说,这并不是一种直接透明的方式

TL;DR:对于已经有一些Brython代码在工作并且希望从Javascript调用Brython函数的人,只需对Brython代码执行以下操作:

def my_func(...):
    ...

from browser import window
window.my_func = my_func
现在,您可以使用普通Javascrit脚本块中的“my_func”,但您必须允许Brython加载并运行其代码—任何使用Brython的javascript都必须在onload事件运行main
Brython
函数后调用。参见下面的示例

因此,在您的情况下,我们可以将log.py文件重写为:

import math

class Logarithm:
    def __init__(self, x, y=10):
        self.x = x
        self.y = y

    def log(self):
        return math.log(self.x,self.y)


from browser import window
window.Logarithm = Logarithm
然后,我们必须正确地编写html文件,将main Brython和Python stdlib作为两个单独的脚本标记加载,在onload事件中激活Brython,然后我们就可以开始了:

<html>
  <head>
    <script src="http://brython.info/src/brython.js"></script>
    <script type="text/javascript" src="http://brython.info/src/brython_stdlib.js"></script>
    <script src="log.py" type="text/python3"></script>
    <script type="text/javascript">
        function do_python() {
            var obj = window.Logarithm(100, 10);
            var result = obj.__class__.log(obj);
            document.write(result);
        }
    </script>
  </head>
  <body onload="brython(); setTimeout(do_python, 300)">

  </body>
</html>

函数do_python(){
var obj=窗口对数(100,10);
var结果=对象类日志(obj);
记录(结果);
}
注意,实际上调用Brython类的Javascript被包装在一个setTimeout调用中。这让布莱顿可以安排好一切。 尽管您可以通过简单地调用类来创建Brython对象的实例,但要对其调用方法,您必须手动调用
\uuuuu class\uuuu
属性,并将实例作为第一个参数显式传递

只有从Brython使用实例时,才会使用在类中查找方法名称并自动添加
self
参数的机制

<html>
  <head>
    <script src="http://brython.info/src/brython.js"></script>
    <script type="text/javascript" src="http://brython.info/src/brython_stdlib.js"></script>
    <script src="log.py" type="text/python3"></script>
    <script type="text/javascript">
        function do_python() {
            var obj = window.Logarithm(100, 10);
            var result = obj.__class__.log(obj);
            document.write(result);
        }
    </script>
  </head>
  <body onload="brython(); setTimeout(do_python, 300)">

  </body>
</html>