super.__new和object.__new的用法
时间: 2023-05-20 22:01:16 浏览: 117
super.__new和object.__new都是Python中的构造函数,用于创建新的实例对象。但是它们的用法有所不同。
object.__new__是Python中所有类的默认构造函数,它接受一个类作为参数,并返回一个新的实例对象。通常情况下,我们不需要重写它。
而super.__new__是用于继承中的构造函数,它接受两个参数:子类和子类的实例对象。它会调用父类的构造函数,并返回一个新的实例对象。通常情况下,我们需要在子类中重写它,以便在创建实例对象时调用父类的构造函数。
例如,假设我们有一个父类Animal和一个子类Dog,我们可以在Dog中重写super.__new__,以便在创建Dog实例对象时调用Animal的构造函数:
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def __new__(cls, name):
print("Creating a new Dog instance")
return super().__new__(cls)
def __init__(self, name):
super().__init__(name)
d = Dog("Fido")
print(d.name)
输出结果为:
Creating a new Dog instance
Fido
相关问题
Python 里的 super() 函数和 object.__new__ ()、.__del__() 方法
super() 函数是用于调用父类的方法。在子类中,如果想要调用父类的方法,可以使用super()函数来实现。例如,如果父类有一个名为`foo()`的方法,子类可以使用`super().foo()`来调用父类的方法。
而`object.__new__()`方法是在创建一个新的实例时调用的特殊方法。它负责创建并返回一个新的实例对象。一般情况下,我们不需要直接调用`object.__new__()`方法,而是使用类的构造函数来创建实例对象。
另外,`.__del__()`方法是在对象被销毁时调用的特殊方法。它可以用来执行一些资源释放或清理工作。但需要注意的是,由于垃圾回收机制的存在,不建议在`.__del__()`方法中进行太复杂的操作,因为无法确定对象何时被销毁。
def __new__(cls, backend=None, prefix=None, **kwargs): if backend is None and prefix is None: backend = 'disk' if backend is not None and backend not in cls._backends: raise ValueError( f'Backend {backend} is not supported. Currently supported ones' f' are {list(cls._backends.keys())}') if prefix is not None and prefix not in cls._prefix_to_backends: raise ValueError( f'prefix {prefix} is not supported. Currently supported ones ' f'are {list(cls._prefix_to_backends.keys())}') # concatenate the arguments to a unique key for determining whether # objects with the same arguments were created arg_key = f'{backend}:{prefix}' for key, value in kwargs.items(): arg_key += f':{key}:{value}' if arg_key in cls._instances: _instance = cls._instances[arg_key] else: # create a new object and put it to _instance _instance = super().__new__(cls) if backend is not None: _instance.client = cls._backends[backend](**kwargs) else: _instance.client = cls._prefix_to_backends[prefix](**kwargs) cls._instances[arg_key] = _instance return _instance
这段代码是 Python 中的一个类的构造方法 __new__,它用于创建一个新对象并返回它。这个类接受三个参数:backend、prefix 和 **kwargs。如果 backend 和 prefix 都没有被指定,则默认使用 disk 作为 backend。如果指定的 backend 或 prefix 不在 _backends 或 _prefix_to_backends 中,则会引发一个 ValueError 异常。这个类会将所有的参数拼接成一个唯一的 key,用于判断是否已经创建了具有相同参数的对象。如果已经创建了这样的对象,则返回已有的对象;否则,创建一个新对象并将其存储到 _instances 中。根据参数指定的 backend 或 prefix,创建一个新的 client 对象,并将其赋值给新创建的实例对象的 client 属性。最后,返回新创建的对象。
阅读全文