在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__
方法,因为Cars
是type
的实例。
type.__call__(Cars, ...)
会做一些事情。 首先它叫Cars.__new__(Cars, ...)
。 这将返回您将在最后分配给tesla
或ford
或其他任何内容的新实例。 然后,如果__new__
返回的是Cars
一个实例,它将调用Cars.__init__(self, ...)
,其中self
是它刚刚创建的新实例。
这就是self
传递给__init__
。 请记住,所有步骤都可以自定义或重写,所以这只是对最简单情况的基本概述。
本文中的链接应该让你开始更具体的研究。 所有的链接都是完全不同的,即使它们是相同的术语。 所有链接都是堆栈交换站点(SO有一个例外),或官方的Python 3文档,但有一个例外。
1我编写了这个统计数据,但无论如何它可能是正确的。
链接地址: http://www.djcxy.com/p/51123.html