python之路-双下方法,,双下方法定义:双下方


双下方法

定义:双下方法是特殊方法,他是解释器提供的,由双下线加方法名加双下划线 __方法名__具有特殊意义的方法双下方法主要是Python源码程序员使用的,元编程我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更有益于我们阅读源码

1.__len__ 计算长度

s = ‘nihaoashuaige‘print(len(s))#len作为内置函数,部分数据类型调用它的时候就会返回其长度,那是什么让这个函数起了这样的作用呢#看一下字符串的str类的内容里有__len__方法,所以调用len内置函数,其实就是触发了__len__方法

class A:    def __init__(self,name,age):        self.name = name        self.age = age    def __len__(self):        print(‘调用len方法‘)        return len(self.__dict__)obj = A(‘红‘,‘24‘)print(len(obj))打印结果:调用len方法2
触发机制:调用len,就立即触发了__len__方法,并执行里面的内容

2.__hash__

#我们之前说过,可hash的就是不可变的数据类型,那么这个是如何进行判断的呢print(hash(‘nihao‘)) #返回一串数字print(hash(123)) #返回一串数字print(hash([1,2,3])) #报错打印结果:-3334696613266170804123

3.__str__

class A:    def __init__(self,name,age):        self.name = name        self.age = age    def __str__(self): #打印的时候返回的结果值        return self.nameobj = A(‘nihao‘,18)print(obj)打印结果:nihao

4.__repr__

repr内置函数,原形毕露,调用repr,则触发__repr__方法,返回其原始值

class A:    def __repr__(self):        return ‘nihao‘obj = A()print(repr(obj))打印结果:nihao

5.__call__ 对象后面加(),触发执行

class A:    def __init__(self):        print(111)    def __call__(self, *args, **kwargs):        print(666)obj = A()obj()  ##对象+()触发__call__方法打印结果:111666

6.__eq__

class A:    def __init__(self):        self.a = 1        self.b = 2    def __eq__(self, other):        print(666)        return ‘比较‘a = A()b = A()print(a == b)#同一个类的两个实例进行比较,就会触发类中的__eq__方法打印结果:666比较

7.__del__

析构方法,当对象在内存中被释放时,自动触发执行。注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

8.__new__ 类名+()触发__new__方法 构造方法

class A:    def __init__(self,name,age):        self.name = name        self.age = age    def __new__(cls, *args, **kwargs):        print(666)        return object.__new__(cls)obj = A(‘xiaohong‘,‘19‘) ##构造一个对象是先触发__new__方法
单例模式(一个类只能实例化一个对象)

class A:    __instance = None    def __new__(cls,*args,**kwargs):        if not cls.__instance:            obj = object.__new__(cls)            cls.__instance = obj        return cls.__instanceret = A()print(ret)ret = A()print(ret)ret = A()print(ret)打印结果:<__main__.A object at 0x00000263D5202B00><__main__.A object at 0x00000263D5202B00><__main__.A object at 0x00000263D5202B00>

9.__item__相关

当你对对象进行类似于字典的操作的时候,就会触发相应的方法

class A:    def __init__(self,name):            self.name = name    def __getitem__(self, item):        return self.__dict__[item]    def __setitem__(self, key, value):        self.__dict__[key] = value    def __delitem__(self, key):        print(‘删除的时候执行我‘)ret = A(‘nihao‘)print(ret[‘name‘]) #执行getitemret[‘name‘] = ‘xiaohong‘ #执行setitemprint(ret.__dict__)del ret[‘name‘] #执行delitem打印结果:nihao{‘name‘: ‘xiaohong‘}删除的时候执行我

10.上下文管理器相关(__enter__ 和 __exit__)

class A:    def __init__(self,text):        self.text = text    def __enter__(self): #开启上下文管理器时执行此方法        self.text = self.text + ‘来了‘        return self    def __exit__(self, exc_type, exc_val, exc_tb): #执行完上下文管理器时执行此方法        self.text = self.text + ‘走了‘        return selfobj = A(‘baobao‘)with obj as f:    print(f.text)print(f.text)打印结果:baobao来了baobao来了走了

python之路-双下方法

评论关闭