区块链(python)第一个问题:python中的__new__

背景:
class NewTuple(tuple):
def new(cls,*arg):
print(“create a object”)
return super(NewTuple, cls).new(cls,arg)
def init(self, c, d):
print(“what’s my job”)
self.c = c
self.d = d
问题一:new()是什么意思?
问题二:super(NewTuple, cls)中的参数为什么又有NewTuple又有cls,它俩不是一个意思吗?

解答一:
在 Python 中,new 方法是一个特殊的方法,它用于创建一个类的实例。它是 init 方法的对立面,init 方法用于初始化一个已经创建的实例。
对于不可变类型,如 tuple、str、int 等,new 方法在实例创建时被调用,而 init 方法在实例创建之后被调用。
对于 tuple,new 方法用于创建一个新的 tuple 对象。当你创建一个 tuple 时,Python 调用 tuple.new(tuple, iterable) 来创建一个新的 tuple 对象,然后调用 init 方法来初始化这个对象。
作用:
创建对象:new 是在 init 之前被调用的,它的主要职责是为对象分配内存,并返回这个新创建的对象实例。
不可变对象初始化:对于像 tuple 这样的不可变类型来说,一旦创建后就不能修改其内容,因此所有的初始化工作必须在 new 中完成。
示例:
下面是一个简单的例子,展示如何在自定义类中使用 new
class MyTuple(tuple):
def new(cls, *args):
# 在这里可以添加任何预处理逻辑
if len(args) != 2:
raise ValueError(“MyTuple requires exactly two arguments”)
# 调用基类(tuple)的 new 方法来创建对象
obj = super(MyTuple, cls).new(cls, args)
return obj
# 创建 MyTuple 实例
t = MyTuple(1, 2)
print(t) # 输出: (1, 2)
# 尝试传入错误数量的参数
try:
t = MyTuple(1, 2, 3)
except ValueError as e:
print(e) # 输出: MyTuple requires exactly two arguments
在这个例子中,我们定义了一个继承自 tuple 的子类 MyTuple,并在 new 方法中检查传入参数的数量是否正确。如果数量不正确,则抛出异常。这样可以确保所有 MyTuple 实例都符合预期的构造规则。

解答二:
super() 的用法
super() 函数有两种常见用法:
显式形式: super(MyTuple, cls).new(cls, args)
隐式形式(Python 3 中推荐使用): super().new(cls, args)
显式形式的解释:
在显式形式中,super(MyTuple, cls) 的两个参数分别代表:
第一个参数:当前类的引用(通常是 MyTuple)。
第二个参数:当前类的实例或类本身(通常是 cls)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值