社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何在python中创建inmutable和singleton对象?

Poshi • 3 年前 • 1419 次点击  

我试图创建一个类,它保存一些数据,并在所有代码中“共享”。就像Python中的字符串一样:它们在任何地方都是共享的,因为它们是不可变的,并且只有一个具有特定值的实例存在。 我想按需创建这个类,但每次我用相同的参数创建这个类时,我都想得到相同的对象。

我编写了以下代码:

class Data:

    _instances: dict[str, "Data"] = {}

    def __new__(cls, data: str) -> "Data":
        if data not in cls._instances:
            cls._instances[data] = super().__new__(cls)

        return cls._instances[data]

    def __init__(self, data: str) -> None:
        self._data = data

    @property
    def data(self) -> str:
        return self._data

    @data.setter
    def data(self, data: str) -> None:
        raise KeyError("Cannot change an immutable object")

这似乎是可行的,但我有一种感觉,就是没有使用Python提供的所有工具来处理这种情况。

有什么方法可以实现这一点吗 dataclass 锿?还是一个更具Python风格的代码来实现同样的效果?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133843
 
1419 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Samwise
Reply   •   1 楼
Samwise    3 年前

可以使用 frozen=True 参数创建数据类 frozen 自动使其可散列,因此您只需使用 functools.cache 而不是实现自己的缓存:

from dataclasses import dataclass
from functools import cache

@dataclass(frozen=True)
class Data:
    data: str

    @cache
    def __new__(cls, data: str) -> "Data":
        return super().__new__(cls)

x = Data("foo")
y = Data("foo")
assert id(x) == id(y)