Python:尝试从另一个类实例的输出设置类实例的属性

2024-10-01 09:36:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个内容块“实例”列表,当列表被处理时,每个块的内容都是在内容类型类的实例中生成的(如果这有意义的话)。在

当我在列表中迭代时,我试图设置modules实例的属性,并使用来自extra_modules的命名模块实例的输出来设置modules实例的属性。如果有更好的方法来写这个问题,请随时编辑。在

下面是我尝试使用Python瓶子框架运行的测试代码的一个示例。我试图在实际将内容生成代码放入photoGallery类之前获得一个测试输出。在

在核心.py公司名称:

import extra_modules

module_blocks_in_db = [
    # module-ID, module-sys-name, module-sys-desc, module-function, module-variables
    [1, 'photo_gallery_main', 'A little intro gallery', 'photoGallery', '{"images": ["photo1.jpg", "photo2.jpg", "photo3.jpg"]}'],
]


class moduleBlocks:
    def __init__(self, mbidb):
        for i in mbidb:
            setattr(self, i[1], getattr(extra_modules, i[3])(i[4]))


@route('/')
def home():
    page_id = 1
    modules = moduleBlocks(module_blocks_in_db)
    return modules.photo_gallery_main

额外的_模块.py公司名称:

^{pr2}$

这是我从瓶子的开发服务器得到的错误:

File "core.py", line 46, in __init__
setattr(self, i[1], getattr(extra_modules, i[3])(i[4]))
TypeError: __init__() should return None

我真的没有很好地理解这个错误,我看的代码越多,我就越困惑自己。我已经尝试了几种不同的方法从类实例获取输出并将其作为我的示例中的moduleBlocks类的属性。我在这方面出了什么问题?在

编辑:我现在把setattr行改为两行,去掉了extra_modules photoGallery类中的返回输出,现在一切正常,谢谢:

x = getattr(extra_modules, i[3])(i[4])
setattr(self, i[1], x.output)

Tags: 实例inpyselfmodules内容列表属性
2条回答

好吧,我想看看你想做什么,我可以告诉你,这种方法至少是有问题的。问题是你试图访问每个类的输出变量,你创建的每个控制器类都必须定义输出变量,并且必须记录每个控制器必须定义输出变量。在

有几种方法可以解决这个问题,有些比其他的好。在

所以这里有一些选择。在

  1. 你真的需要照相馆上课吗。如果它所做的一切都返回一个字符串,并且没有交互或状态更改,那么它作为一个类是没有意义的。改变它和类似的控制器成为一个功能,这就是你需要做的。

  2. 也许在其他地方发生了一些状态变化,那么我的建议是保持透明。python没有接口,但有abc(抽象基类)。你可以让你的所有控制器从abc继承,并定义一个方法,比如get-Output。然后你会有:

    setattr(self,i[1],getattr(额外的模块,i[3])(i[4])。get_output())

  3. 不要推荐这个,因为它真的很恶心,而且会咬你一口:

    setattr(self,i[1],getattr(额外模块,i[3])(i[4])。输出)

以下内容不正确:

class photoGallery:
    def __init__(self, *args):
        self.output = 'Output from photoGallery class instance'
        return self.output

init是photoGallery的构造函数,负责初始化photoGallery对象。因此,它返回任何东西是没有意义的。摆脱回报自输出再试一次

相关问题 更多 >