在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中的methodsclass 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,并遵守你所知道的对象的一般规则,比如从类中创建,等等。这包括functionsclasses。从另一个类创建一个类对象,该类被恰当地命名为metaclass。通常metaclasses是一种你不想打开的蠕虫,所以我们将在这里划出足够的表面,而不是更多。最常见的metaclasstype:作为type实例的初学者将遇到的所有类对象中的99%。 type定义了一个__call__方法,这是你在Cars(...)时调用的,因为Carstype的一个实例。

type.__call__(Cars, ...)做了几件事。首先它叫Cars.__new__(Cars, ...)。这将返回您稍后将分配给teslaford或其他任何内容的新实例。 Then,如果__new__返回的东西是Cars的一个实例,它将调用Cars.__init__(self, ...),其中self是它刚刚创建的新实例。

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


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


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

以上是关于在Python中内部理解自我的主要内容,如果未能解决你的问题,请参考以下文章

Python内部类自我

python之模块和包

30 段 Python 实用代码

自动化测试时需要使用python,请问如何理解python中的全局变量和局部变量?

片段内部静态类和gradle问题

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段