什么是魔法函数?
- 以双下划线开头,并以双下划线结束的函数
- 其并不属于某个类,但是在类内实现后可以赋予类某些特性,让类变得更加灵活。
下面我们来见识一些常见的魔法函数
class Mentor:
def __init__(self, mentor_name):
self.mentor_name = mentor_name
init负责类内成员的初始化,当类初始化实例的时候,会将传入的值赋给类内成员,与c++中的构造函数十分相似。
class Mentor:
def __init__(self, mentor_name):
self.mentor_name = mentor_name
def __getitem__(self, item):
return self.mentor_name[item]
mentor = Mentor(['A','B','C'])
print(mentor[1])
getitem负责自动实现类成员函数的切片操作。
class Mentor:
def __init__(self, mentor_name):
self.mentor_name = mentor_name
def __getitem__(self, item):
return self.mentor_name[item]
def __len__(self):
return len(self.mentor_name)
mentor = Mentor(['A','B','C'])
print(len(mentor))
len函数让类拥有了长度属性
接下来介绍两个比较迷惑人的魔法函数。rper和str。
class Mentor:
def __init__(self, mentor_name):
self.mentor_name = mentor_name
def __getitem__(self, item):
return self.mentor_name[item]
def __len__(self):
return len(self.mentor_name)
def __repr__(self):
return '进入函数1'
print(Mentor(['A','B','C']))
str_是面向用户的,而repr面向程序员,可以理解为:str是给用户使用的,而repr是提供给程序员用于调试程序用的。
str和repr这两个方法都是用于显示的。
当输出一个类的实例的时候,例如上面的例子中的studnet1,如果str和repr这两个方法都没有重写,会输出studnet1的地址;如果重写了,则会输出方法的返回值。
需要注意的是:如果两个方法都重写了,则优先且只调用str这一个方法;如果只重写一个方法,则会调用该方法
总结
魔法函数让编程更加优美,效率更加高。同时注意尽量不要自己定义魔法函数,这样会产生某些冲突。
网友评论