首先python中双下划线方法被称为魔法方法(magic method),显然像__init__
, __call__
, __len__
, __getitem__
, __setitem__
, __delitem__
这些都属于magic method。
__call__()
如果类中定义了__call__()
方法,那么该类的实例对象也将成为可调用对象。该对象被调用时,将执行__call__()
方法中的代码。
示例:
class Person:def __call__(self, name):print("__call__" + " hello " + name)def hello(self, name):print("hello" + name)person = Person()
person("zhangasan") # 个人的理解是相当于把类的对象当作函数来用,即重载了括号运算符person.hello("lisi")
或是:
class Person:def __call__(self, name):return namedef hello(self, name):print("hello" + name)person = Person()
output = person("zhangasan")
当然__call__()
函数也可以不加参数:
class Student:def __init__(self, name, id):self.name = nameself.id = iddef __call__(self):print("Student %s is created." %self.name)print("His ID is:", self.id)stu = Student('Tom', 1)
stu()
__getitem__()
这个方法返回所给键对应的值。
对序列来说(通常是列表),键应该是0~n-1的整数,其中n为序列的长度。
对映射来说(通常是字典),键可以是任何类型。
python是这样规定的:
如果在类中定义了__getitem__()
方法,那么实例 P 就可以以P[key]的形式取值,当实例对象做P[key]运算时, 就会去调用__getitem__()
方法,当对类的属性进行下标操作时,首先会被__getitem__()
拦截,从而执行__getitem__()
方法中设定的操作,如:赋值,修改内容,删除内容等。
示例:
class Tag:def __init__(self, x):self.x = xdef __getitem__(self, item):print('调用了__getitem__()函数')return self.xa=Tag('This is input')
print(a.x)
print(a['py']) # 个人的理解相当于是把类的对象当作一个列表或字典来用
输出:
# print(a.x)的输出
This is input# print(a['py'])的输出
调用了__getitem__()函数
This is input