Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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
python重载()没有任何效果?_Python_Module - Fatal编程技术网

python重载()没有任何效果?

python重载()没有任何效果?,python,module,Python,Module,我在pyspark目录中有一个hbase.py文件。在REPL中,我尝试重新加载它: >>> reload(pyspark.hbase) <module 'pyspark.hbase' from '/shared/hwspark2/python/pyspark/hbase.py'> >>> from pyspark.hbase import * >>> # run the code .. latest changes not ap

我在pyspark目录中有一个hbase.py文件。在REPL中,我尝试重新加载它:

>>> reload(pyspark.hbase)
<module 'pyspark.hbase' from '/shared/hwspark2/python/pyspark/hbase.py'>
>>> from pyspark.hbase import *
>>> # run the code .. latest changes not apparent..
重新加载(pyspark.hbase) >>>从pyspark.hbase导入* >>>#运行代码。。最近的变化不明显。。 没有错误。。然而,这些类别的定义没有更新——新的印刷声明没有出现就证明了这一点


退出解释器并重新加载模块后,更新可见。然而,即使在调用reload之后,对模块的任何进一步更改仍然不可见

我想到了三种可能性(一种是@abarnert的):

  • pyspark.hbase
    有一个
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • pyspark.hbase
    没有
    \uuuuuu all\uuuuuuu
    ,但您的类名/函数等以
    \uuuuu
    开头
  • 重新加载后,您不会重新创建类实例,因此它们仍然绑定到旧模块的类
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。它还用于提供一个名称列表,以便在从。。。已发布导入*
。如果未定义
\uuuuuuuuuuuuuuuuuuuuu
,则模块中任何不以
\uuuuuuu
开头的名称将在
从中加载时加载。。。导入*
用于该模块

无论是否定义了
\uuuuuu all\uuuuuu
,您都可以通过直接请求来显式加载模块中定义的任何名称:

from xyz import _private

\u private
加载到模块的名称空间中。

这个问题并不完全清楚,但我认为您误解了它的作用

它重新导入模块,包括其中定义的所有新类对象,并更改
sys.modules[name]
以引用该新模块对象,还将名称复制到全局对象

但这就是它的全部功能。它不会自动找到对旧模块的所有引用,更不用说在旧模块中定义的任何内容,等等,并将它们全部修复以引用替换版本。(怎么可能呢?新模块中甚至可能没有替换版本。就此而言,如果您的值是由旧代码计算的,并且将以不同的方式计算,该怎么办?导入模块后,它将不得不重新运行您所做的一切。)

文档(链接在上面)用不同的术语解释了它,但是让我们把它具体化,这样我可以更直接地解释它

创建此文件:

# mod.py
class Spam(object):
    def eggs(self):
        print('spam spam spam spam')
现在:

现在让我们编辑它:

# mod.py
class Spam(object):
    def eggs(self):
        print('out of spam!!!')

>>> reload(mod)
>>> spam.eggs()
spam spam spam spam
>>> morespam = mod.Spam()
>>> morespam.eggs()
out of spam!!!
>>> type(spam) is type(morespam)
False
当您通过调用
mod.spam()
创建
spam
时,它会在全局中查找
'mod'
,然后在生成的模块中查找
'spam'
,然后调用其构造函数和初始值设定项,为您提供一个对象,该对象的
mod.spam
是对该
mod.spam
类的引用

当您调用
spam.eggs()
时,Python在全局字典中查找
'spam'
,在
spam
对象的字典中查找
'egs'
,如果没有,则在
spam.\uu class\uuuuu
对象的字典中查找
'egs'
。正如我们所知,这是
mod.Spam
对象,它有一个
eggs
方法,因此被调用

现在,在我们重新加载(mod)
之后,有一个名为
'mod'
的新对象,它有一个名为
'Spam'
的新类作为成员。但是旧的
mod
mod.Spam
对象,以及您的
Spam
——仍然存在。而现有的
垃圾邮件
在其
\uuuu类中仍然引用了旧的
mod.spam
。因此,当您第二次调用
spam.eggs()
时,会发生与以前完全相同的事情。Python以全局方式查找
'spam'
,首先在
spam
中查找
'eggs'
,然后在
spam中查找
。\uuu class\uuuu
,查找与以前相同的类,并调用与以前相同的函数

当我们再次调用
mod.Spam()
来构造
morespam
时,现在它在globals中查找
'mod'
,并找到新的
'mod'
。然后在该模块中查找
“Spam”
,并找到新类。因此,我们有一个实例,它的
\uuu class\uu
是新的
mod.Spam
。当我们调用它的
eggs
方法时,会发生与上面相同的事情,但现在调用的是新函数



使用mod import*
中的
而不是
import mod
会让事情变得更难理解,但基本思想是一样的。mod import*
中的
不会将
mod
放入全局文件中,而是将其所有非私有全局文件(在
mod.\uuuuu all.\uuuuuuu
中列出的任何文件,或者,如果不存在此类文件,则在
mod
中不以单下划线开头的任何文件)复制到全局文件中。因此,
reload
创建了一个新的模块对象,mod import*
的第二个
将新模块的所有非私有全局文件复制到您的全局文件中,替换旧的全局文件。但是您的
spam
实例仍然是旧的
spam
实例,而不是新的。

您是在创建这些类的新实例并使用它们,还是在
重新加载后尝试使用现有实例?您能给我们一个(类似于我回答中的一个)您的意思吗?很难理解你所说的“类的定义没有更新”是什么意思,特别是如果(看起来很可能)整个问题是你(像大多数人一样)我不明白Python类在幕后是如何工作的,并且期望他们做一些他们不可能做的事情。我对所有这些都一无所知,所以任何事情都是公平的。你的第二个要点似乎适用于这里-我们有几个属性,以u开始,这是否意味着需要all?想补充一下吗
# mod.py
class Spam(object):
    def eggs(self):
        print('out of spam!!!')

>>> reload(mod)
>>> spam.eggs()
spam spam spam spam
>>> morespam = mod.Spam()
>>> morespam.eggs()
out of spam!!!
>>> type(spam) is type(morespam)
False