0

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

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

以下只是我尝试使用 Python Bottle 框架运行的测试代码示例。在将内容生成代码实际放入 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

extra_modules.py:

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

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

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)
4

2 回答 2

2

以下是不正确的:

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

_init_ ”是photoGallery的构造函数,负责初始化photoGallery 对象因此,返回任何东西是没有意义的。摆脱 return self.output 并重试

于 2013-06-24T15:53:14.837 回答
0

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

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

所以这里有一些选择。

  1. 你真的需要 photoGallery 作为一个类吗?如果它所做的一切都返回一个字符串并且没有交互或状态变化,那么将它作为一个类是没有意义的。将它和类似的控制器更改为一个函数,这就是你需要做的所有事情。

  2. 也许在其他地方发生了一些状态变化,那么我的建议是透明的。python没有接口,但它有abc(抽象基类)。你可以让你所有的控制器都从 abc 继承并定义一个像 get_ouput 这样的方法。那么您将拥有:

    setattr(self, i[1], getattr(extra_modules, i[3])(i[4]).get_output())

  3. 不要推荐这个,因为它真的很恶心,以后会咬你:

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

于 2013-06-24T16:33:15.487 回答