来源:python中国网 时间:2020-04-05

  本文介绍双下划线del方法、new方法、str方法、repr方法,这几个方法建议大家掌握。

  1、__del__析构方法

  当对象在内存中被释放时,自动触发执行。析构函数的调用是由解释器在进行垃圾回收时自动触发执行的,程序员可以通过手动del对象来调用。

# -*- coding: utf-8 -*-

class A:
    def __del__(self):
        print('被执行了')

if __name__ == "__main__":

    obj=A()
    del obj


被执行了

  2、__new__方法

  实例化对象时init会自动执行,其实在init方法之前,还有一个new方法也会自动执行,我们可以在new里定制一些实例化前的动作。

# -*- coding: utf-8 -*-


class Person(object):
    def __init__(self,name):
        self.name = name
        print("--init ....")

    def __new__(cls, *args, **kwargs):
        print("new.... ",cls)
        print('laowang约会')
        # 调用父类的__new__方法,必须如此,否则__init__方法就不会执行了
        return object.__new__(cls)


if __name__ == "__main__":
    p = Person("老王")
    print(p.name)


new....  
laowang约会
--init ....
老王


  3、__call__方法

     构造方法的执行是由创建对象触发的,而call方法的执行是由对象后加括号触发的,即:对象()或者类()()

# -*- coding: utf-8 -*-


class Person(object):
    def __init__(self,name):
        self.name = name

    def __call__(self, *args, **kwargs):
        print("call...", self, *args, **kwargs)


if __name__ == "__main__":
    p = Person("老王")
    p()
    p(1,2)
    # 注意参数
    Person('小王')(3,4)



call... <__main__.Person object at 0x0000019E2E34E710>
call... <__main__.Person object at 0x0000019E2E34E710> 1 2
call... <__main__.Person object at 0x0000019E2E34E6D8> 3 4

  4、__str__和__repr__

  这2个方法返回值必须是字符串。这俩方法用来改变对象的字符串显示格式。如果__str__没有被定义,那么就会使用__repr__来代替输出。str(obj)或者print(obj)调用__str__; repr(obj)或者print(obj)调用__repr__()

# -*- coding: utf-8 -*-


class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __repr__(self):
        print('repr...')
        return 'repr..{0}{1}'.format(self.name, self.age)

    def __str__(self):
        print('str...')
        return 'str..{0}{1}'.format(self.name, self.age)


if __name__ == "__main__":
    p1 = Person('小王',20)
    s1 = repr(p1)
    s2 = str(p1)
    print(s1,s2)


repr...
str...
repr..小王20 str..小王20