本文共 2280 字,大约阅读时间需要 7 分钟。
在Python的对象创建机制中,__new__方法扮演着"工厂"角色,它负责创建对象实例。对于开发者而言,理解__new__方法的工作机制至关重要,尤其是在处理类实例化时的参数传递问题。本文将通过实际案例,深入探讨__new__方法的参数传递规则。
在Python中,object类是所有类的基础类,它的__new__方法定义如下:
def __new__(*args, **kwargs)
从表面看,似乎可以传递多个参数,但实际情况却并非如此。我们可以通过以下实验来验证这一点。
class Cir: def __new__(cls, *args, **kwargs): print("Python传递给__new__的参数:") print(f"***cls: {cls}") print(f"***args: {args}") print(f"***kwargs: {kwargs}") inst = super().__new__(cls, *args, **kwargs) print("__new__返回值:", inst) return inst def __init__(self, radius): print("In init, self的值为:", self, ", radius的值为:", radius) self.radius = radius cir = Cir(10)# 报错:TypeError: object.__new__() takes no arguments
通过上述实验可以看到,当我们尝试传递额外的参数给__new__方法时,会抛出TypeError错误,提示object.new()不接受任何参数。这表明,尽管object.__new__的函数签名允许传递参数,但实际执行时,只能传递类参数cls。
为了更全面地理解__new__方法的参数传递规则,我们可以构建一个类继承体系,探索不同情况下的参数传递行为。
class Vehicle: passclass Car(Vehicle): def __new__(cls, *args, **kwargs): print(f"Car.__new__被调用,参数为: {args}, {kwargs}") return super().__new__(cls, *args, **kwargs) def __init__(self, radius): self.radius = radius cir = Car(10)
TypeError: Car.__new__() missing 1 required positional argument: 'radius'
class Vehicle: passclass Car(Vehicle): def __new__(cls, *args, **kwargs): print(f"Car.__new__被调用,参数为: {args}, {kwargs}") return super().__new__(cls, *args, **kwargs) def __init__(self, radius): self.radius = radiuscir = Car(10) TypeError: Car.__new__() missing 1 required positional argument: 'radius'
class Vehicle: passclass Car(Vehicle): def __new__(cls, *args, **kwargs): print(f"Car.__new__被调用,参数为: {args}, {kwargs}") return super().__new__(cls, *args, **kwargs) def __init__(self, radius): self.radius = radiuscir = Car(10) TypeError: Car.__new__() missing 1 required positional argument: 'radius'
通过上述实验可以得出以下结论:
在实际开发中,理解__new__方法的参数传递规则可以帮助我们更好地控制对象的创建过程,特别是在需要定制对象创建逻辑时。
转载地址:http://cfi.baihongyu.com/