我完全理解在此示例中传递给 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')
最佳答案
初学者教程没有涵盖许多步骤,因此我会尽量做到简短而透彻。我会尽量使用精确的术语,因此您可以查找所有您不清楚的部分。
一般来说,methods在 Python 中是 class object 中的函数.所有功能都是descriptors . descriptor 的一部分意思是当你通过 instance 访问一个方法时一个类,它创建一个 closure自动将您创建它的实例传递为 self
范围。例如,如果 Cars
有一个 method start(self)
除了 __init__
,然后 tesla.start
将是一个 "bound method" ,这是一个将 tesla
作为 self
传递给 Cars.start
的闭包。请注意,我没有在 tesla.start
之后加上括号。放置括号实际上会调用绑定(bind)方法。
第二条信息:如果一个类定义了一个__call__
special method , 它的实例被称为 callable .这意味着您可以使用 ()
运算符调用一个实例,就好像它是一个函数一样。您可以在执行 tesla = Cars(...)
时看到这种情况。这里 Cars
是一个类对象,但您调用它时就好像它是一个函数一样。我们现在接近 self
实际传递给 __init__
的地方了.
第三,差不多everything在 Python 中是一个 object并遵守您所知道的对象的一般规则,例如从类中创建等。这包括 functions和 classes .一个类对象是从另一个类创建的,该类被恰本地命名为 metaclass .通常 metaclasses是一 jar 你不想打开的蠕虫,所以我们只会在这里抓到足够的表面而不是更多。最常见的metaclass是 type
:99%1 作为初学者会遇到的所有类对象的实例 type
. type
定义一个 __call__
方法,这是您在执行 Cars(...)
时调用的方法,因为 Cars
是 type
的一个实例。
type.__call__(Cars, ...)
做了几件事。首先它调用 Cars.__new__(Cars, ...)
。这将返回您稍后最终分配给 tesla
或 ford
或其他任何东西的新实例。 Then ,如果__new__
返回的是 Cars
的实例,它将调用 Cars.__init__(self, ...)
,其中 self
是它刚刚创建的新实例已创建。
这就是 self
传递给 __init__
的方式。请记住,所有步骤都可以是 customized或覆盖,所以这实际上只是最简单情况的基本概述。
本文中的链接应该可以帮助您开始更具体的研究。所有链接都是完全不同的,即使它们是针对同一个术语的。所有链接都指向 Stack Exchange 站点(SO,但有一个异常(exception))或官方 Python 3 文档,只有一个异常(exception)。
1 这个统计数据是我编造的,但它可能是对的。
关于python - 在 Python 内部理解 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49442025/