我完全理解在此示例中将传递给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')
答案 0 :(得分:8)
初学者教程没有涉及很多步骤,因此我将尝试简短但彻底。我将尽力使用我的术语,因此您可以查找所有不清楚的部分。
通常,Python中的methods是class object中的函数。所有功能都是descriptors。作为descriptor的一部分意味着,当您通过类的instance访问方法时,它会创建一个closure,它会自动将您创建的实例传递给self
method 3}}参数。例如,如果Cars
除了start(self)
之外还有"bound method" __init__
,那么tesla.start
将是__call__
,这是一个关闭将tesla
作为self
传递给Cars.start
。请注意,我没有在tesla.start
之后添加括号。放括号实际上会调用绑定方法。
第二条信息:如果某个类定义了special method callable,则其实例称为__init__
。这意味着您可以使用()
运算符调用实例,就像它是一个函数一样。执行tesla = Cars(...)
时,您可以看到这种情况。这里Cars
是一个类对象,但你把它称为函数。我们现在已接近self
实际传入everything的位置。
第三,Python中的object几乎是functions,并遵守您对对象所知的一般规则,例如从类创建等等。这包括classes和{{ 3}}。从另一个类创建一个类对象,该类适当地命名为metaclass。通常metaclasses是你不想打开的一堆蠕虫,所以我们将在这里划出足够的表面,而不是更多。最常见的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
是刚创建的新实例。< / p>
这就是self
传递给__init__
的方式。请记住,所有步骤都可以customized或覆盖,因此这只是对最简单情况的基本概述。
本文中的链接应该让您开始更具体的研究。所有链接都是完全不同的,即使它们是相同的术语。所有链接都是Stack Exchange站点(SO有一个例外)或官方Python 3文档,但有一个例外。
1 我编制了这个统计数据,但无论如何它可能都是正确的。