首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建类共享内存中的方法而不复制python3中的每个对象

如何创建类共享内存中的方法而不复制python3中的每个对象
EN

Stack Overflow用户
提问于 2018-06-24 07:04:00
回答 1查看 19关注 0票数 0

但是,我想创建一个类,将方法放入内存中一次,然后认为可以共享这些方法的实例必须放入内存中,而不需要这些方法。

EN

回答 1

Stack Overflow用户

发布于 2018-06-24 07:15:44

方法只“放入内存”一次。方法是字节码指令序列,将只存储一次。然而,属性(方法在其上操作)则不是。

我认为,您混淆了类属性和对象属性的区别。按照以下示例中所示使用它们:

class Foo:
    def __init__(self):
        self.object_prop = None

    def set(self, val):
        self.object_prop = val

    def get(self):
        return self.object_prop

然后你可以像这样使用它:

a = Foo()
a.set(3)
print(a.get())  # prints 3
b = Foo()
b.set(4)
print(a.get())  # prints 3

类属性示例如下所示:

class Foo:
    class_prop = None

    @classmethod
    def set(cls, val):
        cls.class_prop = val

    @classmethod
    def get(cls):
        return cls.class_prop

a = Foo()
a.set(3)
print(a.get())  # prints 3
b = Foo()
b.set(4)
print(a.get())  # prints 4

也许这就是你要找的东西。

在评论中,您指出您正在寻找python中的单例实现。在python中,单例是一种反模式,需要不惜一切代价加以避免。但是,在StackOverflow上进行简单搜索会得到following result

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class Logger(metaclass=Singleton):
    pass

使用此实现,所有对象都将具有相同的内存地址:

>>> id(Logger())
140202032740616
>>> id(Logger())
140202032740616
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51005716

复制
相关文章

相似问题

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