Python:使用for循环从对象列表中提取引用

时间:2014-02-14 22:41:32

标签: object python-3.x reference

所以我对python很新,所以要善待。 我正在尝试创建一个全局类型的对象目录作为我所有程序的基础,以便跟踪我的程序中所有创建的对象实例。

所以..

我创建了一个包含对象引用列表(而不是id)的类。 例如:

class objDirectory:
    name = ""
    count = 0
    objDir = []
    def __init__( self ):
        print( "Initiating object directory." )
        name = "objDirectory"
        self.count= 1
        self.objDir = [ self ]
        return
    def getObj( self, name ):
        print( "Searching directory for:", name )
        for o in self.objDir:
            if o.name is name:
                print( "Returning:", name )
                return obj
            else:
                print( "Search failed" )
            return

但是,一旦将对象添加到列表中并运行get脚本,它就不会返回我的对象​​。我甚至使用directory.objDir [x]进行验证。 (这总是引用我的对象)。

我不做什么或做错了什么?

感谢。

结果:

  
    
      

setDirectory()       启动对象目录。       全局目录引用集       test = obj(“test”)       开始:测试       重复检查       记录:test1       对象数:2       t1 = directory.getObj(“test1”)       在目录中搜索:test1       搜索失败       print(directory.objDir)       [< 主要 .objDirectory对象位于0x032C86F0>,< .obj对象位于0x032C8710>]

    
  

1 个答案:

答案 0 :(得分:0)

我不太明白你打算如何使用这个对象,但我发现__init__方法存在一些问题。
首先,我猜你的对象应该是singleton,但事实并非如此。您可以在此处定义类属性:

class objDirectory:
    name = ""
    count = 0
    objDir = []

但是在__init__方法中,您始终会覆盖它们,而不是添加它们。这意味着,每次您编写a=objDirectory()之类的内容时,count将为该实例设置为 。另外,请注意(至少在python2.7中),您需要一个@classmethod装饰器,用于您希望能够修改类属性的每个函数(而不是实例的属性)。像这样:

class objDirectory:
    count=0

    @classmethod
    def add_object(cls):
        cls.count+=1
    def __init__(self):
        self.add_object()

这也适用于objDir 其次,在__init__方法中,您有一个名为name的变量,该变量从未使用过。也许你的意思是self.name

有更好的方法来实现单例,但是这里有一个简单的例子,如果你是python的新手可能更容易理解:

class mySingleton(object):
    singletonObject = None
    def __new__(cls):
        if not cls.singletonObject:
            cls.singletonObject = super(mySingleton, cls).__new__(cls)
        return cls.singletonObject

__new__方法是一种创建实际实例的静态方法。返回值是创建的新实例。像这样覆盖它会让我为mySingleton()的每次调用获得相同的实例;声明mySingleton() is mySingleton()永远是真的。