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

时间:2013-06-24 15:40:51

标签: python class bottle setattr

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

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

以下只是我尝试使用Python Bottle框架运行的测试代码的示例。在我实际将内容生成代码放入photoGallery类之前,我正试图获得测试输出。

core.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)

2 个答案:

答案 0 :(得分:2)

以下内容不正确:

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

_ init _ ”是photoGallery的构造函数,它负责初始化photoGallery对象。因此,返回任何东西都没有意义。摆脱返回self.output并再试一次

答案 1 :(得分: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)