Understanding Self Internally in Python
我完全理解在这个例子中传递给self的是什么。我对它是如何在内部传递给self感到非常困惑。有人能帮我理解吗?
1 2 3 4 5 6 7 8 9 10
| 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') |
- 考虑Class阅读Python教程。操作系统是不是一个教程的网站。
- 是的,我读的教程,这是和其他职位。我很不明白它是如何通过自审,式。谢谢反正。
- @本。我猜你是不是读正确的教程。不,真的有很多很好的,是诚实的。
- @ C???????????????S??????????????????????。。。。。。。有效的OP有点在这里。其他的问题是不是一个很好的副本。OP是不知道的事实,实际上是等价的语法来调用object.__call__(Cars, ...)Cars.__new__和传球,这结果对__init__和其他问题,我们是不是真的是.
- "把你的madphysicist Word是它。我没有仔细的重复分析的我可能应该reopened E、操作系统。
- @ C???????????????S??????????????????????。。。。。。。我appreciate信托。
- ×××××××type.__call__,不object._call__。我的错误。
- benhutton"。我已经添加了几根链接在我的答案你跟随。他们对我能找到的最reputable源(SO)和Python文档的过程:)希望它使你更容易和引入到Python的基本事实。
- @ C???????????????S??????????????????????。。。。。。。我希望在合理的reopen
- "madphysicist真棒,伟大的作品。I’ll try and see if I can get to the这个由sopython礼服在线列表。
- @ C???????????????S??????????????????????。。。。。。。我甚至不知道的事了:)
初学者教程中有许多步骤不涉及,所以我将尝试简单而彻底。我会尽量用准确的术语,这样你就可以查到所有你不清楚的部分。
通常,Python中的方法是类对象中的函数。所有函数都是描述符。描述符的一部分含义是,当您通过类的实例访问一个方法时,它会创建一个闭包,该闭包会自动将创建它的实例作为self参数传递给它。例如,如果Cars除了__init__之外还有一个方法start(self),那么tesla.start将是一个"绑定方法",它是一个将tesla作为self传递给Cars.start的闭包。注意,我没有在tesla.start后面加括号。放括号实际上会调用绑定方法。
第二条信息:如果一个类定义了一个__call__特殊方法,那么它的实例就称为可调用的。这意味着您可以像使用()运算符的函数一样调用实例。当你做tesla = Cars(...)时,你会看到这样的情况。这里,Cars是一个类对象,但您调用它时好像它是一个函数。我们现在已经接近于self实际被传递到__init__的位置。
第三,在Python中,几乎所有的东西都是一个对象,并且遵循您知道的关于对象的一般规则,比如从类中创建等等,这包括函数和类。类对象是从另一个类创建的,该类被适当命名为元类。通常,元类是一罐你不想打开的蠕虫,所以我们将在这里抓取足够多的表面而不再。最常见的元类是type:99%的类对象是你作为初学者会遇到的type实例。type定义了__call__方法,这是在执行Cars(...)时调用的方法,因为Cars是type的实例。
type.__call__(Cars, ...)做了一些事情。首先,它叫Cars.__new__(Cars, ...)。这将返回一个新实例,您稍后将把它分配给tesla或ford或其他对象。那么,如果__new__返回的是Cars的实例,它将称为Cars.__init__(self, ...),其中self是它刚刚创建的新实例。
这就是self被传递给__init__的方式。请记住,所有步骤都可以自定义或重写,因此这实际上只是最简单情况的基本概述。
本文中的链接将帮助您开始更具体的研究。所有的链接都是完全不同的,即使它们是同一个术语。所有链接都指向堆栈交换站点(只有一个例外),或者官方的python3文档,只有一个例外。
我做了统计,但可能是对的。
- 我非常感谢你抽出时间来讨论这个问题。这让我更好地理解了每件事情是如何一起工作的,以及一些需要做进一步研究的事情。谢谢你