自定义python包中的对象范围

Posted

技术标签:

【中文标题】自定义python包中的对象范围【英文标题】:Scope of object in custom python package 【发布时间】:2022-01-22 09:02:49 【问题描述】:

我正在尝试制作 2d 图形包。我已经做了很多尝试来找到最好的结构,但我不能让它很好地工作。这是当前不工作的设置:

我有文件 init.pyscene.pypolygon.py

scene.py 应该初始化一个对象,该对象有一个数组,其中假设存储了多边形。此文件的简单版本如下所示:

class make_scene:
    def __init__(self,width,height,**kwargs):
        self.width = width
        self.height = height
        self.color = kwargs.get('color', '#ffffff')
        self.draw_elements = []

#init scene:
the_scene = make_scene(500, 250) 

polygon.py 定义了一些要绘制的对象(圆形、立方体等):

class cube:
    def __init__(self,x,y,**kwargs):
        self.x = x
        self.y = y
        self.color = kwargs.get('color', '#000000') 
        the_scene.append(self)

init.py 只是导入模块和一些辅助包:

from .scene import *
from .polygon import *

但是,如果我尝试使用这个包,scene_file 的范围不正确:

cube(0,0,10,10)
>>> NameError: name 'the_scene' is not defined

我被多种不同的架构困住了。如果我将它保存在一个看起来并不理想的文件中,我可以让它工作。

想解决这个问题还是尝试不同的架构?我会喜欢你的意见。

【问题讨论】:

什么是package?您没有显示任何可以导入的具有该名称的内容。为了保持理智,请避免导入通配符。 谢谢@mkrieger1 我只是指定义包的 3 个文件,但我觉得这很混乱,所以我编辑了问题 【参考方案1】:

问题似乎是您的 polygon.py 文件不知道 the_scene 对象。 Python 不会在像 init.py 这样的公共文件中将两者链接在一起。

尝试从您的 polygon.py 文件中导入 the_scene 函数,例如

from .polygon import the_scene

【讨论】:

以上是关于自定义python包中的对象范围的主要内容,如果未能解决你的问题,请参考以下文章

如何构造一个使用 Python 中其他包中的函数的函数?

怎么在java项目中调自定义的jar包中的类?

python 一个包中的文件调用另外一个包文件 实例

Python之路-包

就地自定义对象使用 __getitem__ python 3.5 与 python 3.6 解包不同的行为

python 读取位于包中的数据文件