首页 > 解决方案 > Python - 从派生类实例化的对象的序列号

问题描述

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

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

我尝试了几种方法,但都失败了,所以除了故障排除之外,有人能指出一个好的设计模式吗?

谢谢。

标签: pythoninstancederived-classserial-number

解决方案


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

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 () 方法来创建类的新实例。new (cls[, ...]) 带有适当的参数,然后在返回之前根据需要修改新创建的实例。


推荐阅读