Python高级特性之常见的内建函数

内建函数(__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

猜你喜欢

转载自blog.csdn.net/qq_25948717/article/details/81704859
今日推荐