【问题标题】:Python "Magic methods" are realy methods?Python“魔术方法”真的是方法吗?
【发布时间】:2019-09-19 19:03:13
【问题描述】:

我知道如何在python中使用神奇的方法,但我想了解更多。

为此,我想考虑三个例子:

1)__init__:

我们在大多数类的开头使用 this 作为构造函数。如果这是一个方法,与之关联的对象是什么?它是用于生成所有其他对象的基本 python 对象吗?

2) __add__ 我们用它来改变操作符+ 的行为。上面同样的问题。

3)__name__: 它最常见的用法是在这种结构内部:if __name__ == "__main__":

当你将模块作为主程序运行时返回 True。

我的问题是__name__ 是方法还是变量?如果它是一个变量,与之关联的方法是什么。如果这是一个方法,与之关联的对象是什么?

由于我对这些方法不是很了解,可能问题没有很好地提出。我想了解这些方法在 Python 中是如何构造的。

【问题讨论】:

  • 简而言之,Python 在特定时间用特定方式命名的东西做特定的事情。那些“某些名称”几乎都是这样的词,这是“Python 的特殊东西”的约定。 __init__ 在对象构建时被调用(如果存在)。一个模块的__name__是系统设置的等等……

标签: python object methods


【解决方案1】:
  • __init__ 不是构造函数;它是一个initializer,在__new__(它一个构造函数)的返回值上自动(通常)调用。

    x = Foo() 大致相当于

    x = Foo.__new__(Foo)
    Foo.__init__(x)
    
  • x + y 等价于x.__add__(y)type(x).__add__(x, y)

  • __name__ 不是方法;它是一个str-valued 模块级属性,包含当前模块的名称。

【讨论】:

    【解决方案2】:
    1. 对象是被实例化的类,也就是Foo in Foo.__init__(actual_instance)
    2. a + b中的对象是a,表达式等价于a.__add__(b)
    3. __name__ 是一个变量。它不能是一种方法,因为与字符串的比较总是False,因为函数永远不会等于字符串

    【讨论】:

    • 是的,我认为我们的两个答案之间没有太大区别。 (显然,涉及两个不同的选民。)
    • 第一个陈述当然看起来很奇怪......你的意思是self 不是实例吗?否则,你的“对象”是什么意思?
    • @deceze,“对象”是Foo.__init__(instance) 中的Fooself 是参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2020-07-17
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多