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

时间:2015-12-02 04:14:04

标签: python

根据我的理解,__str____next____setattr__等神奇方法是Python中的内置功能。它们将在创建实例对象时自动调用。它也起到了被覆盖的作用。我还省略或忽略魔法的一些重要特征?

3 个答案:

答案 0 :(得分:4)

python中的“magic”方法在特定的上下文中执行特定的操作。

例如,要“覆盖”加法运算符(+),您需要定义__add__方法。减法为__sub__等。

在对象创建期间调用其他方法(__new____init__)。其他方法与特定语言结构一起使用(__enter____exit__,您可能会认为__init____next__)。

真的,没有什么特殊的关于魔术方法,除了保证在特定时间被语言调用。作为程序员,你有能力挂钩结构并改变对象在这种情况下的行为方式。

有关近乎完整的摘要,请查看python data model

答案 1 :(得分:1)

你可以用魔术方法做很多事情,因为很难找到正确的入门方式,我想给你一些关于我经常使用的东西的启发。< / p>

虽然您可能已经在使用其中的一些(例如__init__),但我会开始学习运算符特定的魔术方法,这有助于我大量优化类以及如何使用它们。例如,神奇的方法__mul__允许你描述你的类应该发生什么,以防它被乘法运算符调用。在下面的示例中,您可以看到,解释器首先查找被乘数的__mul__方法,如果这不存在(如第二个示例中所示),它会尝试调用乘数的__rmul__方法

示例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

示例2:

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 :(得分:0)

提示:

为了使您的课程具有可比性,您可以使用__cmp__。 使用要比较的两个类调用该方法。 如果第一个类更大,则返回正值。 如果第二个类更大,则返回一个负值。 如果它们具有相同的大小,则返回零。 你不必为每种可能性使用魔法。