内建函数(__xxx__):
1 类似字典的操作方式,__getitem__ __setitem__ __delitem__
d = dict()
d["a"] = 1
d["b"] = 2
print(d)
del d["a"]
print(d)
与下面结果一样:
class TestDict(object):
def __getitem__(self,key):
return self.__dict__.get(key)
def __setitem__(self,key,value):
self.__dict__[key] = value
def __delitem__(self,key):
self.__dict__.pop(key)
td = TestDict()
td["a"] = 1
td["b"] = 2
print(td["a"])
print(td.__dict__)
del td["a"]
print(td.__dict__)
2 __new__和__init__
__new__: 在类实例化的时候调用,用来创建实例,如果不返回实例那么__init__将不会执行,
第一个参数是class对象,在创建实例的时候需要有返回值
__init__: 在初始化实例的时候调用,比如说实例属性赋值,第一个参数是实例对象,一般都重写__init__方法,
在执行的时候不需要返回值
class TestNew(object):
def __new__(cls, *args, **kwargs):
print('__new__ called.')
return super(TestNew,cls).__new__(cls,*args,**kwargs)
def __init__(self):
print('__init__ called.')
self.a = 1
tn = TestNew()#类实例化
print(tn.a)
结果:
__new__ called.
__init__ called.
1
用__new__来实现单例模式
class Singleton(object):
def __new__(cls):
# 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
obj1 = Singleton()
obj2 = Singleton()
obj1.attr1 = 'value1'
print(obj1.attr1, obj2.attr1)
print(obj1 is obj2)
结果:
value1 value1
True
Tips: 单例模式有很多种实现方式,也可以通过类变量+静态方法的方式实现。
可以通过重载__new__来实现很多创建实例时的功能。
4 __call__
把一个类实例的对象当做函数一样调用就是复写了__call__方法,如下:
class TestCall(object):
def __call__(self):
print "call it"
tc = TestCall()
tc()
5 __all__
可用于模块导入时限制,,当我们from module import *的时候这个__all__就起作用了,__all__=["bar","sar"] ,[]里定义函数或者变量类等,有些模块内部一些函数不对外开放,此时把一些对外开放的函数变量放入到__all__里就可以了,这样避免了一些多余的导入。如果在__init__.py里定义则在导入模块的时候只导入__all__里定义的各个文件,此时无法定义到文件里具体哪个类或方法,如果需要细化则需要在具体的类里写入__all__。如果是from module import Test这种使用不受__all__限制
6 __setattr__,__getattr__,__delattr__
__setattr__: 对变量赋值时调用。
__getattr__:默认查找对象属性是在一个字典里(__dict__),这里没有要查找的对象则去__getattr__方法里查找,如果我们复写__getattr__则可以根据实际需求来返回值。
__delattr__:删除属性时调用。
class TestAttr(object):
def __init__(self):
self.name = "abc"
def __getattr__(self, item):
print "item:" + str(item)
print "getattr"
return 10
def __setattr__(self, *args, **kwargs):
print "set attr"
object.__setattr__(self,*args,**kwargs)
def __delattr__(self, *args, **kwargs):
print "delete attr"
object.__delattr__(self,*args, **kwargs)
ta = TestAttr()
print ta.__dict__
print ta.names
del ta.name
print ta.__dict__
7 __le__,__lt__,__ge__,__gt__,__ne__,__eq__
一个对象和另一个对象比较大小,返回的并不一定是True和False,返回值有可能是我们定义的任何值,这里就是复写上面这些方法。如下:
class TestCompare(object):
def __lt__(self, other):
return "aaa"
t = TestCompare()
print t<1