Python - 从派生类实例化的对象的序列号

Posted

技术标签:

【中文标题】Python - 从派生类实例化的对象的序列号【英文标题】:Python - serial number for objects instantiated from derived classes 【发布时间】:2021-08-12 05:43:23 【问题描述】:

必须经常出现在所有派生类的所有实例中添加唯一序列号的需要。但是我找不到样本。或匹配我对 *** 的搜索。

如果我从 Animal 派生的三个类中实例化鸟类、哺乳动物和蠕虫,则 SN 值应该是 1、2、3。然后一个犬类(源自哺乳动物)的实例应该得到 SN 4。然后下一只鸟得到 SN 5。

我尝试了几种方法,但都失败了,所以与其排除故障,谁能指出一个好的设计模式?

谢谢。

【问题讨论】:

在你的父类上做一些like this。 【参考方案1】:

您可以通过自定义 __new__ 来控制 obj 创建,例如跟踪创建的所有实例并在新创建的对象上设置“串行”属性:

class A:
    num_objects = 0
    def __new__(cls):
        obj = super(A, cls).__new__(cls)
        A.num_objects += 1
        obj.serial = A.num_objects
        return obj

    def __str__(self):
        return '< with serial number >'.format(
            self.__class__.__name__,
            self.serial)

class B(A):
    pass

class C(A):
    pass

a = A()
b = B()
c = C()

print(a)
print(b)
print(c)

# <A with serial number 1>
# <B with serial number 2>
# <C with serial number 3>

来自文档:

典型实现通过使用 super().new(cls[, ...]) 调用超类的 new() 方法来创建类的新实例适当的参数,然后在返回之前根据需要修改新创建的实例。

【讨论】:

OP 要求每个实例都有自己的唯一 ID。 示例 #1 - 我被包裹在基类中递增 - 我看到可以在派生的 init 中递增。 serial 是一个类变量,所以一旦你生成了 6 个对象,如果你再次打印它们,它们都将显示为相同的序列号。例如,a = A(); b = B(); print(a, b) 您必须设置self.serial,以便instance 具有唯一的序列值。

以上是关于Python - 从派生类实例化的对象的序列号的主要内容,如果未能解决你的问题,请参考以下文章

Java中为啥要序列化?啥时候用到序列化?

使用Boost将派生类部分反序列化为基类时输入流错误

序列化与反序列化

在 C# 中使用派生类从 XML 反序列化对象

将派生类型序列化为 AppDomain 上的基本类型

如何键入提示 Python 函数返回从超类派生的任何类的实例?