来源:python中国网 时间:2019-06-06

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

  del析构方法

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

# ‐*‐ coding: utf‐8 ‐*‐


print("  以下是__del__")
class Foo:

    def __del__(self):
        print('执行我啦')


f1=Foo()
del f1
print('------->')

D:installpython3python.exe D:/pyscript/test/test.py
  以下是__del__
执行我啦
------->

Process finished with exit code 0


  new方法

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

# ‐*‐ coding: utf‐8 ‐*‐

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

    def __new__(cls, *args, **kwargs):
        """
        cls  : 代表Person这个类本身
        :param args:
        :param kwargs:
        :return:
        """
        print("--in new: ",cls,*args,**kwargs)
        return object.__new__(cls)  # 调用父类的__new__方法,必须这么干 ,要不然__init__方法就不会执行了


p = Person("老王")
print(p.name)
print(Person)
D:installpython3python.exe D:/pyscript/test/test.py
  以下是__new__
--in new:  <class '__main__.Person'> 老王
--init ....
老王
<class '__main__.Person'>


  call方法

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

# ‐*‐ coding: utf‐8 ‐*‐


class Person(object):

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

    def __new__(cls, *args, **kwargs):
        """
        cls  : 代表Person这个类本身
        :param args:
        :param kwargs:
        :return:
        """
        print("--in new: ", cls, *args, **kwargs)
        return object.__new__(cls)  # 调用父类的__new__方法,必须这么干 ,要不然__init__方法就不会执行了

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


p = Person("老王")
p()  # 此时会执行__call__
D:installpython3python.exe D:/pyscript/test/test.py
--in new:  <class '__main__.Person'> 老王
--init ....
-->call <__main__.Person object at 0x0054F930>

Process finished with exit code 0


  str和repr

  这2个方法比较像,返回值必须是字符串,这俩方法用来改变对象的字符串显示格式。str(obj)或者print(obj)时触发obj.__str__(),repr(obj)或者交互式解释器中调用时触发obj.__repr__()。如果__str__没有被定义,那么就会使用__repr__来代替输出。

print("  以下是__str__、__repr__")

class School:

    def __init__(self,name,addr,type):
        self.name = name
        self.addr = addr
        self.type = type

    def __repr__(self):
        return 'School(%s,%s)' %(self.name,self.addr)

    def __str__(self):
        return '(%s,%s)' %(self.name,self.addr)


s1=School('老王','隔壁','男人')
print('from repr: ',repr(s1))
print('from str: ',str(s1))
print(s1)

'''
注意:这俩方法的返回值必须是字符串,否则抛出异常
'''
D:installpython3python.exe D:/pyscript/test/test.py
  以下是__str__、__repr__
from repr:  School(老王,隔壁)
from str:  (老王,隔壁)
(老王,隔壁)

Process finished with exit code 0