所以我对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>]
答案 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()
永远是真的。