繁体   English   中英

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

[英]what is the role of magic method in python?

根据我的理解,诸如__str__ __next____next__ __setattr__ __next____next__ __setattr__类的魔术方法是Python的内置功能。 创建实例对象时,它们会自动调用。 它还起着覆盖的作用。 我会忽略或忽略魔术方法的其他一些重要功能吗?

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

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

在对象创建期间会调用其他方法( __new__ __init____init__ )。 其他方法用于特定的语言构造( __enter__ __init____next__ __exit__ ,您可能会争论__init____next__ )。

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

有关接近完整的摘要,请查看python 数据模型

魔术方法可以做很多事情,并且由于很难找到正确的入门方法,因此我想给您一些有关我正在使用的东西的启发。

虽然您可能已经在使用其中的一些方法(例如__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

任何其他操作员都与此示例相对应。 我希望这可以帮助您开始增强魔术方法的技能。

暗示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM