Python:将全局对象声明为实例变量

时间:2014-07-02 05:26:23

标签: python list variables global functor

我正在用Python编写一个很大程度上依赖于全局列表变量的应用程序。程序中的每个函数都对一个或所有这些全局列表应用更改。 编码时,我发现我需要几个涉及全局列表之间元素移动的函数,所有这些函数都涉及相同的代码行 - 所以我写了一个合适的函子类。

以下程序总结了我在做什么。我将引用它来描述我的应用程序中出现的问题:

#Global List variables
garbage=[]
paper=[]
metal=None

class movementFunctor:
    def __init__(self,source,destination):
        self.source=source
        self.destination=destination
    def __call__(self,item):
        self.source.remove(item)
        self.destination.append(item)

GtoP=movementFunctor(garbage,paper)
GtoM=movementFunctor(garbage,metal)
PtoM=movementFunctor(paper,metal)

def main():
    global garbage,paper,metal
    metal=[]
    #initialize garbage, paper, and plastic with numbers 0 to 5
    for i in range(5):
        garbage.append(i)
        paper.append(i)
        metal.append(i)
    GtoP(2)

    #Problem Code---------------------------------------------------------------------
    PtoM(2)
    #Problem Code---------------------------------------------------------------------
main()

我的仿函数类movementFunctor指定源全局变量列表和目标全局变量列表作为实例变量的参数。然后,调用运算符指定项目从源列表到目标的移动。

我认为这个设计会成功;但是,我在'PtoM(2)'

行中遇到了错误
line 11, in __call__self.destination.append(item)
AttributeError: 'NoneType' object has no attribute 'append'

其中一个全局列表metal已初始化为None,但main应为其分配了一个新的空列表[]。那么为什么PtoM仿函数会在分配空列表时遇到金属被声明为None的问题?

我无法在线或从以前的帖子中找到有关将全局变量设置为类的实例变量的问题/复杂性的任何信息。

我是Stack Overflow论坛的新手,所以请原谅/指出我在发布此问题时没有及时遵循的任何约定。

1 个答案:

答案 0 :(得分:3)

您在致电PtoM之前创建了main。那时,metal为None,因此PtoM将其目标设置为None。它没有"观看"变量metal以查看是否分配了其他内容。

解决方案是在开始时指定metal = [],或在设置PtoM后移动mainmetal内的其他人。