python - Python - 从派生类实例化的对象的序列号
问题描述
必须经常出现在所有派生类的所有实例中添加唯一序列号的需要。但是我找不到样本。或者与我对 stackoverflow 的搜索相匹配。
如果我从 Animal 派生的三个类中实例化鸟类、哺乳动物和蠕虫,SN 值应该是 1、2、3。然后一个犬科动物(源自哺乳动物)的实例应该得到 SN 4。然后下一只鸟得到 SN 5。
我尝试了几种方法,但都失败了,所以除了故障排除之外,有人能指出一个好的设计模式吗?
谢谢。
解决方案
您可以通过自定义来控制 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[, ...]) 带有适当的参数,然后在返回之前根据需要修改新创建的实例。
推荐阅读
- r - 在运行位置使用“强制服务器”运行数据函数时出错
- sql-server - 返回只有 NULL 值的列
- html - 如何让 div 尊重 margin-top
- .net - 如果读取了 Request.Body,Request.Form 会抛出“意外的流结束”
- javascript - 为什么我的 javascript 不与网页交互?
- laravel - Laravel 事件未在控制器中触发
- scala - 斯卡拉演奏;地图上的模式匹配;无法解析 Map.unapply
- kettle - PDI Kettle 中结果行的范围是什么?
- python - python中的并行文件读取
- android - android cmake下c++编译报错