Python new 关键字
在 C++ 和 Java 等编程语言中,你可以显式使用 new 关键字从类创建对象。但是,你不能直接在 Python 中使用 new 关键字。在本文中,我们将讨论 new 关键字在 Python 中的工作原理。我们还将看到如何显式地使用 new 关键字来观察 Python 中对象创建的过程。
Python 中的 new
关键字是什么
在 Python 中,__new__
是与对象关联的属性。你可以使用 dir()
函数检查对象的所有属性。dir()
函数将对象作为输入并返回所有对象属性的列表,如下所示。
class Car:
def __init__(self, model, brand, price, country):
self.Brand = brand
self.Model = model
self.Price = price
self.Country = country
myCar = Car("Tesla", "Cybertruck", 40000, "USA")
print(dir(myCar))
输出:
['Brand', 'Country', 'Model', 'Price', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
你可以观察到列表中存在一个 __new__
属性。
在 Python 中如何使用 new
关键字
我们不能像在其他编程语言中那样显式地在 Python 中使用 new 关键字。但是,Python 中的 __new__
属性与其他编程语言中的 new
关键字的作用相同。__new__()
方法在基类object
中定义,用于为对象分配存储空间。
当我们通过使用语法 className()
调用类名来创建一个新对象时,会执行该类的 __call__()
方法。__call__()
方法调用 __new__()
方法。在这里,__new__()
方法为对象分配内存并将控制权返回给 __call__()
方法。
__call__()
方法然后调用 __init__()
方法。__init__()
方法初始化类变量并将控制权返回给 __call__()
方法。__call__()
方法然后完成执行并将对创建的对象的引用返回给我们。
我们如何显式实现 __new__()
方法
我们不需要在 Python 中显式实现 __new__()
方法。但是,如果你想查看 __new__()
方法和 __init__()
方法的执行顺序,我们可以覆盖 __new__()
方法。正如我们在上面看到的,__new__()
方法是一个静态方法,并在对象类中定义。当我们使用类名创建一个对象时,它的 __new__()
方法会被自动调用。
__new__()
方法接受一个代表当前类的输入参数 cls
。然后 __new__()
方法使用当前类作为输入参数调用其超类的 __new__()
方法。这个过程需要继续,直到我们到达基类 object
。在基类 object
中,执行 __new__()
方法,并为我们要创建的对象分配存储空间。然后,创建对象的实例。__new__()
方法然后返回实例,之后 __init__()
方法用于初始化实例中的变量。
你可以在以下示例中观察整个过程。
class Car:
def __init__(self, brand, model, price, country):
print("I am in the __init__() method.")
self.Brand = brand
self.Model = model
self.Price = price
self.Country = country
def __new__(cls, *args, **kwargs):
print("I am in the __new__() method.")
return super(Car, cls).__new__(cls)
myCar = Car("Tesla", "Cybertruck", 40000, "USA")
输出:
I am in the __new__() method.
I am in the __init__() method.
这里,我们实现的 __new__()
方法属于当前类,它不会影响任何对象实例的创建方式。为了改变它,我们需要改变基类 object
中的 __new__()
方法。但是,我们不允许这样做,你不应该尝试进行任何此类实验。此外,你可以在输出中验证 __new__()
方法在 __init__()
方法之前执行。
结论
我们在本文中讨论了 Python 中的 new 关键字。我们还看到了如何使用 dir()
方法获取与类关联的所有属性。此外,我们还看到了如何在 Python 中创建对象以及 __new__()
方法是如何工作的。我们还自己实现了 __new__()
方法。但是,它不是很有用,我建议你不要自己实现 __new__()
方法。