在Python中理解内部自我

我完全理解这个例子中传递给self 东西 。 我很困惑它是如何在内部传递给self 。 有人能帮助我理解吗?

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是:作为type实例,您将作为初学者遇到的所有类对象的type 99%1。 type定义了__call__方法,这是您在执行Cars(...)__call__方法,因为Carstype的实例。

type.__call__(Cars, ...)会做一些事情。 首先它叫Cars.__new__(Cars, ...) 。 这将返回您将在最后分配给teslaford或其他任何内容的新实例。 然后,如果__new__返回的是Cars一个实例,它将调用Cars.__init__(self, ...) ,其中self是它刚刚创建的新实例。

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


本文中的链接应该让你开始更具体的研究。 所有的链接都是完全不同的,即使它们是相同的术语。 所有链接都是堆栈交换站点(SO有一个例外),或官方的Python 3文档,但有一个例外。


1我编写了这个统计数据,但无论如何它可能是正确的。

链接地址: http://www.djcxy.com/p/51123.html

上一篇: Understanding Self Internally in Python

下一篇: Creating a copy of a function with some vars fixed