gpt4 book ai didi

python - 具有 __new__ 和属性的东西

转载 作者:行者123 更新时间:2023-11-30 23:36:37 25 4
gpt4 key购买 nike

我尝试从一些开源 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's use of __new__ and __init__? 找到了关于 __init__ 方法和 __new__ 方法之间的讨论。根据最高评价的评论,只有在子类化诸如 strintunicode 等不可变类型时才应该使用 new元组。但我认为这里使用它是出于其他原因。此外,我不明白为什么类 cls 应该有一个名称(以及为什么它应该与某些文件夹有任何关系)以及为什么我可以调用

n= Node()
n.obs

就像函数 obs 是一个属性函数,但实际上不是..

我很困惑。如果您没有,我等不及您的回复。

最佳答案

此类使用__new__来实现单例模式。

__new__ 为类生成新实例,但在这种情况下,如果之前使用过相同的名称,它将返回现有实例。您不能使用 __init__ 执行此操作,因为这是在创建实例之后调用的。请注意,当 cls._instances.has_key(name) 为 False 时,会调用 self = object.__new__(cls) 来创建新实例类的名称,然后初始化并返回。

为什么该类检查 ./nodes/ 目录中的现有路径尚不清楚,这是一项特定于应用程序的检查,如果没有进一步的上下文,就无法轻易地进一步公开。

@property 装饰器将函数替换为 python descriptor 。当从类中查找属性时,如果该属性有属性,Python 将调用它的 __get__ 方法。 Python 表达式 n.obs 由 Python 转换为 type(n).obs.__get__(n, type(n))property 对象调用包装函数,并在调用 __get__ 时返回结果。

关于python - 具有 __new__ 和属性的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16363472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com