python - 在 Python 内部理解 self

标签 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')

最佳答案

初学者教程没有涵盖许多步骤,因此我会尽量做到简短而透彻。我会尽量使用精确的术语,因此您可以查找所有您不清楚的部分。

一般来说,methods在 Python 中是 class object 中的函数.所有功能都是descriptors . descriptor 的一部分意思是当你通过 instance 访问一个方法时一个类,它创建一个 closure自动将您创建它的实例传递为 self范围。例如,如果 Cars 有一个 method start(self) 除了 __init__,然后 tesla.start 将是一个 "bound method" ,这是一个将 tesla 作为 self 传递给 Cars.start 的闭包。请注意,我没有在 tesla.start 之后加上括号。放置括号实际上会调用绑定(bind)方法。

第二条信息:如果一个类定义了一个__call__ special method , 它的实例被称为 callable .这意味着您可以使用 () 运算符调用一个实例,就好像它是一个函数一样。您可以在执行 tesla = Cars(...) 时看到这种情况。这里 Cars 是一个类对象,但您调用它时就好像它是一个函数一样。我们现在接近 self 实际传递给 __init__ 的地方了.

第三,差不多everything在 Python 中是一个 object并遵守您所知道的对象的一般规则,例如从类中创建等。这包括 functionsclasses .一个类对象是从另一个类创建的,该类被恰本地命名为 metaclass .通常 metaclasses是一 jar 你不想打开的蠕虫,所以我们只会在这里抓到足够的表面而不是更多。最常见的metaclasstype:99%1 作为初学者会遇到的所有类对象的实例 type . type 定义一个 __call__方法,这是您在执行 Cars(...) 时调用的方法,因为 Carstype 的一个实例。

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

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


本文中的链接应该可以帮助您开始更具体的研究。所有链接都是完全不同的,即使它们是针对同一个术语的。所有链接都指向 Stack Exchange 站点(SO,但有一个异常(exception))或官方 Python 3 文档,只有一个异常(exception)。


1 这个统计数据是我编造的,但它可能是对的。

关于python - 在 Python 内部理解 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49442025/

相关文章:

c# - 搜索实现特定接口(interface)并执行方法的类

android - 从 DB 类或 MVC 中的数据模型类查询数据库?

python - 如何将数据重定向到 "getpass"之类的密码输入?

python - Fasttext 如何将 .csv 列加载到 model.predict 中

python - 从字符串中删除元音

R/Python - 将字符串列拆分为多个不同的列

python - 如何在 Python 中过滤包含子字符串的 jsonpath 表达式中的 URL 列表

python - 在 Python 3 中调用命令行参数

python - 在python中计算文本文件中的字母

c++ - C++ 中的枚举 : how to pass as parameter?