在python中了解self

Understanding Self Internally in Python

我完全理解在这个例子中传递给self的是什么。我对它是如何在内部传递给self感到非常困惑。有人能帮我理解吗?

1
2
3
4
5
6
7
8
9
10
class Cars:

    def __init__(self, model, engine, doors):

        self.model = model
        self.engine = engine
        self.doors = doors

tesla = Cars('Model S', 'Electric', 'Four door')
ford = Cars('Mustang', 'v8', 'Two door')


初学者教程中有许多步骤不涉及,所以我将尝试简单而彻底。我会尽量用准确的术语,这样你就可以查到所有你不清楚的部分。

通常,Python中的方法是类对象中的函数。所有函数都是描述符。描述符的一部分含义是,当您通过类的实例访问一个方法时,它会创建一个闭包,该闭包会自动将创建它的实例作为self参数传递给它。例如,如果Cars除了__init__之外还有一个方法start(self),那么tesla.start将是一个"绑定方法",它是一个将tesla作为self传递给Cars.start的闭包。注意,我没有在tesla.start后面加括号。放括号实际上会调用绑定方法。

第二条信息:如果一个类定义了一个__call__特殊方法,那么它的实例就称为可调用的。这意味着您可以像使用()运算符的函数一样调用实例。当你做tesla = Cars(...)时,你会看到这样的情况。这里,Cars是一个类对象,但您调用它时好像它是一个函数。我们现在已经接近于self实际被传递到__init__的位置。

第三,在Python中,几乎所有的东西都是一个对象,并且遵循您知道的关于对象的一般规则,比如从类中创建等等,这包括函数和类。类对象是从另一个类创建的,该类被适当命名为元类。通常,元类是一罐你不想打开的蠕虫,所以我们将在这里抓取足够多的表面而不再。最常见的元类是type:99%的类对象是你作为初学者会遇到的type实例。type定义了__call__方法,这是在执行Cars(...)时调用的方法,因为Carstype的实例。

type.__call__(Cars, ...)做了一些事情。首先,它叫Cars.__new__(Cars, ...)。这将返回一个新实例,您稍后将把它分配给teslaford或其他对象。那么,如果__new__返回的是Cars的实例,它将称为Cars.__init__(self, ...),其中self是它刚刚创建的新实例。

这就是self被传递给__init__的方式。请记住,所有步骤都可以自定义或重写,因此这实际上只是最简单情况的基本概述。

本文中的链接将帮助您开始更具体的研究。所有的链接都是完全不同的,即使它们是同一个术语。所有链接都指向堆栈交换站点(只有一个例外),或者官方的python3文档,只有一个例外。

我做了统计,但可能是对的。