Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
magic方法在python中的作用是什么?_Python - Fatal编程技术网

magic方法在python中的作用是什么?

magic方法在python中的作用是什么?,python,Python,根据我的理解,诸如\uuuuu str\uuuuuuuuu、\uuuuuu next\uuuuuuuuu、\uuuuuuu setattr\uuuuuuuuuuu之类的神奇方法都是Python的内置功能。它们将在创建实例对象时自动调用。它还起着覆盖的作用。我还应该忽略或忽略魔法方法的哪些重要特征 python中的“magic”方法在特定的上下文中做特定的事情 例如,要“覆盖”加法运算符(+),您需要定义一个\uuuuuuuuuuuuuu方法。减法是\uuuu sub\uuuu等 在对象创建过程中

根据我的理解,诸如
\uuuuu str\uuuuuuuuu
\uuuuuu next\uuuuuuuuu
\uuuuuuu setattr\uuuuuuuuuuu
之类的神奇方法都是Python的内置功能。它们将在创建实例对象时自动调用。它还起着覆盖的作用。我还应该忽略或忽略魔法方法的哪些重要特征

python中的“magic”方法在特定的上下文中做特定的事情

例如,要“覆盖”加法运算符(+),您需要定义一个
\uuuuuuuuuuuuuu
方法。减法是
\uuuu sub\uuuu

在对象创建过程中调用其他方法(
\uuuuuu new\uuuuu
\uuuuuu init\uuuu
)。其他方法用于特定的语言结构(
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
),您可能会争论
\uuuuuuuuuuuuuu

实际上,除了保证在特定时间被语言调用之外,魔术方法没有什么特别之处。作为程序员,您有权连接到结构中,并在这些情况下更改对象的行为方式


对于一个近乎完整的总结,请看一看python。

使用魔法方法可以做很多事情,因为很难找到正确的开始方法,我想给你一些关于我经常使用的东西的灵感

虽然您可能已经在使用其中的一些方法(如
\uuuu init\uuuu
),但我会开始学习特定于运算符的魔术方法,这有助于我优化类以及如何使用它们。例如,magic方法
\uuuu mul\uuuu
允许您描述在类被乘法运算符调用时发生的情况。在下面的示例中,您可以看到,解释器首先查找被乘数的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

示例1:

class a:
    def __mul__(self, other):
        print("__mul__ a")

    def __rmul__(self, other):
        print("__rmul__ a")

class b:
    def __mul__(self, other):
        print("__mul__ b")

    def __rmul__(self, other):
        print("__rmul__ b")

ia = a()
ib = b()

ia * ib
# prints __mul__ a
class a:
    pass

class b:
    def __mul__(self, other):
        print("__mul__ b")

    def __rmul__(self, other):
        print("__rmul__ b")

ia = a()
ib = b()

ia * ib
# prints __rmul__ b
示例2:

class a:
    def __mul__(self, other):
        print("__mul__ a")

    def __rmul__(self, other):
        print("__rmul__ a")

class b:
    def __mul__(self, other):
        print("__mul__ b")

    def __rmul__(self, other):
        print("__rmul__ b")

ia = a()
ib = b()

ia * ib
# prints __mul__ a
class a:
    pass

class b:
    def __mul__(self, other):
        print("__mul__ b")

    def __rmul__(self, other):
        print("__rmul__ b")

ia = a()
ib = b()

ia * ib
# prints __rmul__ b
与此示例对应的任何其他操作符都可以工作。我希望这能帮助你开始提高你的魔法方法技能。

提示:

要使您的类具有可比性,您可以使用。 使用比较的两个类调用该方法。 如果第一个类较大,则返回正值。 如果第二个类较大,则返回一个否定值。 如果大小相同,则返回零。
你不必对每一种可能性都使用神奇的方法。

你能进一步改进你的问题吗?更多的解释可能会让它更清楚。是什么让你认为在创建对象时会自动调用神奇的方法?看看这个!《魔法方法完整指南》@RahulLakhanpal,大约有十分之一的魔法方法。@TigerhawkT3我很少看到编程人员在课外称魔法方法。因此,我猜测magic方法在后端或后台运行,或者在初始化实例对象后调用它们。