在Python中内部理解自我
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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中的methods是class object中的函数。所有功能都是descriptors。作为descriptor的一部分意味着,当您通过类的instance访问方法时,它会创建一个closure,它会自动将您创建它的实例作为self
参数传递。例如,如果Cars
除了method之外还有start(self)
__init__
,那么tesla.start
将是"bound method",这是一个封闭,将tesla
作为self
传递给Cars.start
。请注意,我没有在tesla.start
之后添加括号。放括号实际上会调用绑定方法。
第二条信息:如果一个类定义了__call__
special method,它的实例据说是callable。这意味着您可以使用()
运算符调用实例,就好像它是一个函数一样。当你做tesla = Cars(...)
时,你可以看到这种情况。这里Cars
是一个类对象,但是你把它称为函数。我们现在接近self
实际上被传递到__init__
的地方。
第三,Python中的几乎everything是一个object,并遵守你所知道的对象的一般规则,比如从类中创建,等等。这包括functions和classes。从另一个类创建一个类对象,该类被恰当地命名为metaclass。通常metaclasses是一种你不想打开的蠕虫,所以我们将在这里划出足够的表面,而不是更多。最常见的metaclass是type
:作为type
实例的初学者将遇到的所有类对象中的99%。 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有一个例外),或官方Python 3文档,但有一个例外。
1我编制了这个统计数据,但无论如何它可能都是正确的。
以上是关于在Python中内部理解自我的主要内容,如果未能解决你的问题,请参考以下文章