一、更正概念
首先必须强调一下国内很多翻译为魔法函数是不严谨的,正确应为魔法方法(magic method),因为魔法方法都是定义在类中的。
二、关于调用
魔法方法并不是都能自动调用的,刚开始接触魔法方法的时候产生了这样一个误解,以为所谓的魔法所具有的魔力是能够自动调用,然而我错了。少部分能够自动调用,大部分是需要特定条件的触发。
2.1 自动调用
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
print('Hello, my name is:',name,'and my age is:',age)
return
def sayHello(self):
print('Hello, my name is',self.name)
p1 = People("Tandy", 30) #这里不需要主动调用p1.__init__方法,俗称构造方法,这里是默认自动调用的
p1.sayHello() #但这个方法必须主动调用才能执行
2.2 触发调用
像__str__()则属于触发调用,在打印对象print(obj)时,即触发调用__str__
方法,而普通方法str(),如果不主动调用则不会执行。下面用魔法方法__str__()和普通方法str()的执行效果对比看一下:
代码1:
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
# return
def __str__(self):
return self.name + ":" + str(self.age)
p1 = People("Tandy",30)
print(p1)#触发调用魔法方法
代码1输出:Tandy:30
代码2:
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
# return
def str(self):
return self.name + ":" + str(self.age)
#if __name__=="__main__":
p1 = People("Tandy",30)
print(p1) #输出对象的内存地址
代码2输出: <__main__.People object at 0x0000015E02EE3390>