我尝试从一些 OpenSource GitHub 项目中理解以下代码。有一个没有方法__init__
但有__new__
方法的类。代码如下:
class Node(object):
#pylint: disable=W0404
#Singleton-Pattern
_instances = dict()
def __new__(cls, name=None):
""" Instanciates a node from a file, and (name=None) creates a new node
Caution: Filenames are always given relative to the root-dir
When no name is given, a new node is created. """
if(name!=None and cls._instances.has_key(name)):
return(cls._instances[name])
if(name==None): # a new node, lets find a name
for i in itertools.count(0):
name = "node%.4d"%i
if(cls._instances.has_key(name)): continue# new nodes might not been saved, yet
if(path.exists("./nodes/"+name)): continue
break
self = object.__new__(cls)
cls._instances[name] = self
#actuall init-code
from ZIBMolPy.pool import Pool #avoids circular imports
self._pool = Pool() #Pool is a singleton
self._name = name
self._tmp = Store() #for thing that need to be stored temporarly
self._obs = Store()
self.parent = None
if(path.exists(self.dir)):
self.reload()
#self.pool.append(self) #register with pool
return(self)
#---------------------------------------------------------------------------
@property
def obs(self):
return(self._obs)
我在Python 使用 __new__ 和 __init____init__
的方法和方法之间找到了一个讨论?
根据评价最高的评论,只有在继承不可变类型(如 、 或 )时才应使用new 。但我认为这里是出于其他原因使用它。此外,我不明白为什么该类应该有一个名称(以及为什么它应该与某些文件夹有关)以及为什么我可以调用__new__
str
int
unicode
tuple
cls
n= Node()
n.obs
就像函数 obs 将是一个属性函数,但它实际上不是..
我很困惑。如果你不是,我等不及你的回应。