在Python中理解自我内部

7

我完全理解这个例子中传递给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')

2
考虑阅读一篇Python“类”教程。SO不是一个教程网站。 - DYZ
2
@cᴏʟᴅsᴘᴇᴇᴅ。OP 在这里提出了一个很有价值的观点。另一个问题并不是一个非常好的重复问题。OP 不知道语法实际上等同于 object.__call__(Cars, ...),它调用 Cars.__new__ 并将结果传递给 __init__,而另一个问题并不真正涉及到这一点。 - Mad Physicist
1
@BenHutton。我在我的回答中添加了几十个链接供您查看。它们是我能找到的最有声望的来源(SO和Python文档 :) 希望这能使过程更容易,并介绍您认识Python的细节。 - Mad Physicist
@cᴏʟᴅsᴘᴇᴇᴅ。希望我已经证明了重新开放的理由。 - Mad Physicist
@cᴏʟᴅsᴘᴇᴇᴅ。我甚至不知道这是件事 :) - Mad Physicist
显示剩余6条评论
1个回答

13

初学者教程中有许多步骤没有涉及,因此我将尝试简明扼要但全面地介绍。我会尽力在术语上精确,以便您可以查阅所有您不清楚的部分。

一般来说,Python 中的方法类对象中的函数。所有函数都是描述器。作为描述器的一部分,当通过类的实例访问方法时,它会创建一个闭包,自动将你创建它的实例作为self参数传递。例如,如果Cars除了__init__外还有一个方法start(self),那么tesla.start将是一个绑定方法,它是一个闭包,将tesla作为self传递给Cars.start。请注意,我没有在tesla.start后面放括号。放括号实际上会调用绑定方法。
第二条信息:如果一个类定义了__call__特殊方法,那么它的实例被称为callable。这意味着你可以使用()运算符调用一个实例,就像调用函数一样。当你执行tesla = Cars(...)时,你可以看到这种情况。这里Cars是一个类对象,但你却像调用函数一样调用它。我们现在接近于将self实际传递给__init__的地方了。
第三,Python中几乎所有都是一个对象并遵循你已知的对象通用规则,例如从类创建等。这包括函数。一个类对象是从另一个类创建的,这个类被适当地称为元类。通常元类是一个你不想打开的麻烦,所以我们只会在这里简单介绍一下。最常见的元类type:99%1的所有类对象作为初学者遇到的实例都是type的实例。type定义了一个__call__方法,当你执行Cars(...)时就会调用它,因为Carstype的一个实例。

type.__call__(Cars, ...)会执行几个操作。首先,它调用Cars.__new__(Cars, ...)。这将返回新的实例,稍后您将把它分配给teslaford等变量。 然后, 如果__new__返回的是Cars的实例,则会调用Cars.__init__(self, ...),其中self是刚创建的新实例。

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


这段文本中的链接将引导您进行更具体的研究。即使是同一术语的链接也完全不同。所有链接都指向Stack Exchange网站(带有一个例外)或官方Python 3文档(带有一个例外)。{{请注意,此处的“例外”未作进一步解释。}}

1我编造了这个统计数据,但它很可能是正确的。


非常感谢您抽出时间讨论这个问题。这让我更好地理解了所有事物是如何相互配合的,并为我进一步研究提供了依据。谢谢。 - Ben Hutton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接