1.什么是魔法方法
魔法方法就是可以给你的类增加特殊功能的方法,通常是系统自定好的已双下划线开头以及双下划线结尾的的方法.如果你自己写的类重写了这些方法,那么这个方法就会在特殊的情况下被python调用,你可以自己定义想要的行为,而这一切都是自动发生的.例如__init__()
,__new__()
,__call__()
,__getItem__()
注意: 魔法方法和继承没有关系,只要是在一个类中实现了这些方法,它就会在特殊的情况下被调用
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/14 11:39'
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
# 让这个类创建的对象,是可以迭代的,就是可以遍历的
def __getitem__(self, item):
return self.employee[item]
company = Company(['tom', 'bob', 'jane'])
employee = company.employee
for em in employee:
print(em)
company2 = company
for em in company2: # 如果company类没有实现__getitem__方法,这里会报错误
print(em)
2.Python常见的魔法方法
1. 字符串表示 __repr__ 和 __str__
区别:它们都是可以将我们的类对象表示成为一个字符串.但是__str__
一般是用来给用户看的,便于理解.
而__repr__
一般是用来给程序员看的,在开发模式下,直接写一个对象的时候,就会调用它的__repr__
方法.
注意: 如果一个类中既有__str__方法,又有__repr__方法.
一般在调用print进行显示的时候,会优先调用__str__方法
repr方法一般是表示一个对象的创建信息,程序员可以看懂的方式,比如返回这个对象的继承关系等.
2.len函数的特殊性
我们在使用len(内置类型) 比如list,dict,set,tuple的时候,我们的len()一般不会遍历这些数据的个数,因为这些数据结构都是C语言实现的,在内部存放一个变量,来时刻记录着这些容器的大小,所以len会直接返回这个变量的结果,所以效率是非常高的