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 - 从派生类实例化的对象的序列号的主要内容,如果未能解决你的问题,请参考以下文章