首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python中的不可变对象记忆模式

python中的不可变对象记忆模式
EN

Stack Overflow用户
提问于 2015-09-18 07:18:32
回答 1查看 86关注 0票数 0

我正在尝试为我的一组不可变的类创建一个记忆系统,用于处理符号表达式。到目前为止,我得到的信息如下所示。我不喜欢的事实是,我不能直接阻止对__init__的调用,而必须在对象( new_inst属性)中填充一些东西来跟踪__init__方法是否应该做任何事情。有没有更好的方法来做这件事?

( new_inst参数只是我告诉__new__是否“停止”对__init__的调用的一种简单方法。实际上,这将基于对象是否已经存在于对象缓存中,并且不是__new____init__的参数)。

代码语言:javascript
运行
复制
my_cache = {}

class Base(object):
    def __new__(cls, *args, **kwargs):
        signature = (cls, args)
        if signature in my_cache:
            self = my_cache[signature]
            self.new_inst = True
        else:
            self = object.__new__(cls, *args, **kwargs)
            my_cache[signature] = self
            self.new_inst = False
        return self

class A(Base):
    def __init__(self, a):
        if not self.new_inst:
            print "Initializing A object with a=%d"%(a,)
            self.a = a

class B(Base):
    def __init__(self, a, b):
        if not self.new_inst:
            print "Initializing B object with a=%d, b=%d"%(a,b)
            self.a = a
            self.b = b

a1 = A(1)
a2 = A(1)
a3 = A(3)
b1 = B(1, 2)
b2 = B(1, 2)
b3 = B(1, 3)
print id(a1), id(a2), id(a3)
print id(b1), id(b2), id(b3)

输出:

代码语言:javascript
运行
复制
Initializing A object with a=1
Initializing A object with a=3
Initializing B object with a=1, b=2
Initializing B object with a=1, b=3
140246850102904 140246850102904 140246850102960
140246850103016 140246850103016 140246850103072

编辑:显然我并不清楚我的意思,所以这里有一个更具体的例子。如您所见,第二个A(1)不会导致第二次初始化,并且它返回相同的id。

EN

回答 1

Stack Overflow用户

发布于 2015-09-19 03:14:20

这是一个更短的版本的基础。新的

代码语言:javascript
运行
复制
def __new__(cls, *args, **kwargs):
    signature = (cls, args)
    new_inst = signature in my_cache
    self = my_cache.get(signature, object.__new__(cls, *args, **kwargs))
    self.new_inst = new_inst
    return self

这不会节省太多的处理时间,但它更干净,更有Pythonic风格。我还没有看到一种更简洁的方法来检测新实例并在分配后设置它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32641447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档