根据我的理解,__str__
,__next__
,__setattr__
等神奇方法是Python中的内置功能。它们将在创建实例对象时自动调用。它也起到了被覆盖的作用。我还省略或忽略魔法的一些重要特征?
答案 0 :(得分:4)
例如,要“覆盖”加法运算符(+),您需要定义__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__。 使用要比较的两个类调用该方法。 如果第一个类更大,则返回正值。 如果第二个类更大,则返回一个负值。 如果它们具有相同的大小,则返回零。 你不必为每种可能性使用魔法。