在Python中内部理解自我

时间:2018-03-23 03:44:56

标签: python python-3.x class oop self

我完全理解在此示例中传递给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')

1 个答案:

答案 0 :(得分:8)

初学者教程没有涉及很多步骤,因此我将尝试简短但彻底。我将尽力使用我的术语,因此您可以查找所有不清楚的部分。

通常,Python中的methodsclass 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是你不想打开的一堆蠕虫,所以我们将在这里划出足够的表面,而不是更多。最常见的metaclasstype:99% 1 所有类对象,您将作为初学者遇到type的实例。 type定义__call__方法,这是您Cars(...)时调用的方法,因为Carstype的实例。

type.__call__(Cars, ...)做了两件事。首先它调用Cars.__new__(Cars, ...)。这将返回您稍后将分配给teslaford或其他任何内容的新实例。 Then,如果__new__返回的内容是Cars的实例,则会调用Cars.__init__(self, ...),其中self是刚创建的新实例。< / p>

这就是self传递给__init__的方式。请记住,所有步骤都可以customized或覆盖,因此这只是对最简单情况的基本概述。

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

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