Python - 访问模块内的对象变量
Python - Accessing object variables within a module
我有一个模块(即 python 文件)包含不同的 类 函数,这里称为 'Experiment_1'。当 运行 将它作为主文件时,所有对象都可以访问所有变量 - object_2 函数可以访问 object_1 中的变量,依此类推:
# Experiment_1
class A():
def process1(self):
self.x=10
def process2(self):
self.y=20
class B():
def addition(self):
summed=object_1.x+object_1.y
print(summed)
if __name__ == '__main__':
object_1=A()
object_2=B()
object_1.process1()
object_1.process2()
object_2.addition()
接下来,我尝试 运行 文件 'Experiment_2' 中的这个作为导入模块:
# Experiment_2
from Experiment_1 import *
import Experiment_1
object_1=A()
object_2=B()
object_1.process1()
object_1.process2()
object_2.addition()
并得到错误信息:
File "C:\Program Files\Sublime Text 3\Experiment_2.py", line 10, in <module>
object_2.addition()
File "C:\Program Files\Sublime Text 3\Experiment_1.py", line 10, in addition
summed=object_1.x+object_1.y
NameError: name 'object_1' is not defined
因此,object_2 无法再访问 object_1 的变量。我一直在寻找解决方案,但可能使用了错误的关键字,或者只是缺乏理解,无法在看到答案时识别它 - 谁能给我提示如何继续?
提前致谢!
导入模块时,以 if __name__ == "__main__":
开头的块不会执行,因为模块的 name 变量设置为导入它的名称( “Experiment_1”在这种情况下)。来自 official documentation:
When a Python module or package is imported, name is set to the module’s name. Usually, this is the name of the Python file itself without the .py extension
如果您希望代码无论是导入的还是直接从命令行 运行 执行的,只需将其放在底部即可。
未测试,但我认为以下脚本是解决方案,因为您需要继承属性。请测试更改(在第一个模块上)并给出响应。
class A():
def __init__(self):
self.x = 0
self.y = 0
def process1(self):
self.x=10
def process2(self):
self.y=20
class B(A):
def __init__(self):
A.__init__(self)
def addition(self):
summed = self.x + self.y
print(summed)
if __name__ == '__main__':
object_1 = A()
object_2 = B()
object_1.process1()
object_1.process2()
object_2.addition()
编辑
抱歉,我不知道 B 可以做所有的事情。这是好的解决方案:
experiment1.py
class A:
def __init__(self):
self.x = 0
self.y = 0
def process1(self):
self.x = 10
def process2(self):
self.y = 20
class B(A):
def __init__(self):
A.__init__(self)
def addition(self):
summed = self.x + self.y
print(summed)
if __name__ == '__main__':
object_1 = B()
object_1.process1()
object_1.process2()
object_1.addition()
experiment2.py
from Experiment1 import *
if __name__ == '__main__':
object_1 = B()
object_1.process1()
object_2.process2()
object_2.addition()
解释:因为Bclass继承了Aclass的方法和属性,所以不需要实例化Aclass。所有作品都可以运行 by B class.
正如其他用户所说,在 B class 中,您正在使用在 main section 中声明的全局变量,当您导入模块时,该变量是无法访问的,这就是if __name__ == '__main__':
问题是您在 Experiment_1.py
中的对象实例化。只有当您 运行 将文件作为脚本而不是在导入它时,才会执行下面块中的代码。
if __name__ == '__main__':
pass
所以在 class B
的对象中,addition
方法中的以下语句,
#Experiment_1.py
summed=object_1.x+object_1.y
将object_1
视为未定义,因为它仅在导入模块时未执行的 if __name__ == '__main__':
块中实例化。
看到这个问题:What does if __name__ == "__main__": do?
对于解决方案,如果您希望使用模块结构,解决方法是将对象传递给添加方法。
#Experiment_1.py
class A():
def process1(self):
self.x = 10
def process2(self):
self.y = 20
class B():
def addition(self, obj):
summed = obj.x + obj.y
print(summed)
然后在你的下一个文件中,
from Experiment1 import *
# import Experiment1
object_1=A()
object_2=B()
object_1.process1()
object_1.process2()
object_2.addition(object_1)
我有一个模块(即 python 文件)包含不同的 类 函数,这里称为 'Experiment_1'。当 运行 将它作为主文件时,所有对象都可以访问所有变量 - object_2 函数可以访问 object_1 中的变量,依此类推:
# Experiment_1
class A():
def process1(self):
self.x=10
def process2(self):
self.y=20
class B():
def addition(self):
summed=object_1.x+object_1.y
print(summed)
if __name__ == '__main__':
object_1=A()
object_2=B()
object_1.process1()
object_1.process2()
object_2.addition()
接下来,我尝试 运行 文件 'Experiment_2' 中的这个作为导入模块:
# Experiment_2
from Experiment_1 import *
import Experiment_1
object_1=A()
object_2=B()
object_1.process1()
object_1.process2()
object_2.addition()
并得到错误信息:
File "C:\Program Files\Sublime Text 3\Experiment_2.py", line 10, in <module>
object_2.addition()
File "C:\Program Files\Sublime Text 3\Experiment_1.py", line 10, in addition
summed=object_1.x+object_1.y
NameError: name 'object_1' is not defined
因此,object_2 无法再访问 object_1 的变量。我一直在寻找解决方案,但可能使用了错误的关键字,或者只是缺乏理解,无法在看到答案时识别它 - 谁能给我提示如何继续?
提前致谢!
导入模块时,以 if __name__ == "__main__":
开头的块不会执行,因为模块的 name 变量设置为导入它的名称( “Experiment_1”在这种情况下)。来自 official documentation:
When a Python module or package is imported, name is set to the module’s name. Usually, this is the name of the Python file itself without the .py extension
如果您希望代码无论是导入的还是直接从命令行 运行 执行的,只需将其放在底部即可。
未测试,但我认为以下脚本是解决方案,因为您需要继承属性。请测试更改(在第一个模块上)并给出响应。
class A():
def __init__(self):
self.x = 0
self.y = 0
def process1(self):
self.x=10
def process2(self):
self.y=20
class B(A):
def __init__(self):
A.__init__(self)
def addition(self):
summed = self.x + self.y
print(summed)
if __name__ == '__main__':
object_1 = A()
object_2 = B()
object_1.process1()
object_1.process2()
object_2.addition()
编辑
抱歉,我不知道 B 可以做所有的事情。这是好的解决方案:
experiment1.py
class A:
def __init__(self):
self.x = 0
self.y = 0
def process1(self):
self.x = 10
def process2(self):
self.y = 20
class B(A):
def __init__(self):
A.__init__(self)
def addition(self):
summed = self.x + self.y
print(summed)
if __name__ == '__main__':
object_1 = B()
object_1.process1()
object_1.process2()
object_1.addition()
experiment2.py
from Experiment1 import *
if __name__ == '__main__':
object_1 = B()
object_1.process1()
object_2.process2()
object_2.addition()
解释:因为Bclass继承了Aclass的方法和属性,所以不需要实例化Aclass。所有作品都可以运行 by B class.
正如其他用户所说,在 B class 中,您正在使用在 main section 中声明的全局变量,当您导入模块时,该变量是无法访问的,这就是if __name__ == '__main__':
问题是您在 Experiment_1.py
中的对象实例化。只有当您 运行 将文件作为脚本而不是在导入它时,才会执行下面块中的代码。
if __name__ == '__main__':
pass
所以在 class B
的对象中,addition
方法中的以下语句,
#Experiment_1.py
summed=object_1.x+object_1.y
将object_1
视为未定义,因为它仅在导入模块时未执行的 if __name__ == '__main__':
块中实例化。
看到这个问题:What does if __name__ == "__main__": do?
对于解决方案,如果您希望使用模块结构,解决方法是将对象传递给添加方法。
#Experiment_1.py
class A():
def process1(self):
self.x = 10
def process2(self):
self.y = 20
class B():
def addition(self, obj):
summed = obj.x + obj.y
print(summed)
然后在你的下一个文件中,
from Experiment1 import *
# import Experiment1
object_1=A()
object_2=B()
object_1.process1()
object_1.process2()
object_2.addition(object_1)