gpt4 book ai didi

python - 为每个类类型自动生成唯一 ID

转载 作者:行者123 更新时间:2023-12-05 06:11:06 26 4
gpt4 key购买 nike

我有一个有趣的问题。我想写一个类,它在继承时为所有子类提供以下行为:

  • 将其 self.id 属性设置为 UUID 值-- 如果这是第一次实例化类,则生成一个新的 UUID-- 当多次实例化时,UUID 值被同一个类重用

现在,有趣的部分是:我希望上述机制能够工作,而不管用于实例化此类的路径如何。让我们假设以下情况:

from .Package.Class1 import Class1
from TopPackage.Package.Class1 import Class1

from .Package.Class2 import Class2
from TopPackage.Package.Class2 import Class2

在这两种情况下,我都希望 Class1 在两种导入样式中生成相同的 self.id 值。我还希望 Class2 生成与 Class1 不同的 self.id 值,但在其自己的导入样式之间相同。

到目前为止,我为类 1 和 2 将继承的类编写了以下代码:

class ClassWithId(ABC):
_EXISTING_OBJECT_IDS = dict()

def __init__(self):
if self in ClassWithId._EXISTING_OBJECT_IDS.keys():
self.id = ClassWithId._EXISTING_OBJECT_IDS[self]
else:
self.id = uuid.uuid4()
ClassWithId[self] = self.id

但是,我这里有几个问题:

  • ClassWithId 必须从类ABC 继承,因为它也是类1 和2 的接口(interface)
  • 尝试将 self 作为 dict() 中的键导致 TypeError: 'ABCMeta' object does not support item assignment
  • 我通常不确定这种方法是否会抵抗不同的导入样式,因为从 Python 的角度来看,类类型 .Package.Class1.Class1TopPackage.Package.Class1。 Class1 是 2 个不同的对象

有什么想法吗?

更新:我已将 Elrond 的建议集成到我的代码中,但不同的导入级别(按包方式)会为同一类产生不同的 UUID 值:

<class 'StageTwo.Steps.SsTestHandler1.SsTestHandler1'>   3583c89c-5ba8-4b28-a909-31cc27628370
<class 'tests.TestStages.StageTwo.Steps.SsTestHandler1.SsTestHandler1'> f4ead4a0-f5f7-4d95-8252-0de47104cb2f

<class 'StageTwo.Steps.SsTestHandler2.SsTestHandler2'> 8bd9a774-0110-4eee-a30c-a4263ad546cf
<class 'tests.TestStages.StageTwo.Steps.SsTestHandler2.SsTestHandler2'> 773d84c4-82a3-4684-92b5-51509e6db545

可能忘记说了,我的ClassWithId是被ClassX和ClassY继承下来的,就是这2个类,应该可以抵抗我上面展示的情况(导入路径不同,但是仍然保留相同的 UUID)。

最佳答案

您需要使用 metaclass 为此:

import uuid
import abc

class BaseMeta(abc.ABCMeta):
def __new__(mcs, name, bases, attrs):
attrs['_class_uuid'] = uuid.uuid4()
return super().__new__(mcs, name, bases, attrs)

class Base(metaclass=BaseMeta):
def __init__(self):
print(self.__class__.__name__, self._class_uuid)

现在所有从 Base 继承的类都将通过 _class_uuid 属性分配一个 uuid,每个子类一次:

from package1.class1 import Class1
from package2.class2 import Class2

Class1() # 6e0852c8-61c9-4f8b-9817-eeeda4b49d56
Class1() # 6e0852c8-61c9-4f8b-9817-eeeda4b49d56

Class2() # 73012f1a-a984-4f76-96f1-ef5225a38fbe
Class2() # 73012f1a-a984-4f76-96f1-ef5225a38fbe

在任何一种情况下,使用绝对/相对导入都不应该有所不同。

关于python - 为每个类类型自动生成唯一 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64147507/

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