程序运行过程中,会产生垃圾,将会影响运行性能,因此需要进行及时的垃圾清理。
垃圾
垃圾指的是程序运行过程产生的没用的东西,没用,换言之就是没用被引用的对象。写出来,但是不用,自然就是单纯占用资源而不发挥作用的,所以被定为垃圾。垃圾多了会影响性能。
class Shiyan():
leishuxing = 6
def __init__(self):
self.shilishuxing = '⑨'
def shilifangfa(self):
print('实例方法')
@classmethod
def leifangfa(cls):
print('类方法',cls)
@staticmethod
def jingtaifangfa():
print('静态方法')
def __del__(self):
print('对象已回收')
s = Shiyan()
print(s.shilishuxing)
s = None
input('输入任意内容后程序结束')
⑨
对象已回收
输入任意内容后程序结束
比如这个过程,类Shiyan()被创建出来,但是没有任何的对象引用他(因为引用他的对象s已经被赋值为None了),所以他就变成了垃圾。从结果看也能知道,(双下划线)del(双下划线)(self)方法的作用就是在这个类没有被引用的时候删除他。另外,之所以在最后加一个input(‘输入任意内容后程序结束’)是因为,直接结束程序的话,无论这个类有没有被引用,都会变成垃圾,因为程序结束了。
s = Shiyan()
print(s.shilishuxing)
# s = None
input('输入任意内容后程序结束')
⑨
输入任意内容后程序结束
可以看出,s = None被取消后,类就不是垃圾了,没有被删除。
其他特殊方法
之前讲过,特殊方法的格式基本上就是 (双下划线)方法名(双下划线)(形参)。有一些特殊方法比较常见。
比如,(双下划线)str(双下划线)(形参)方法,作用是返回打印对象的返回值,就是说设置之后打印对象会打印你设置的内容,不设置的话就会默认打印对象id等等内容,简而言之就是把对象转换为字符串。
class Guobaotegong():
def __init__(self,name,breed):
self._name = name
self._breed = breed
def __str__(self):
return 'Guobaotegong成员[ %s, 品种是 %s]'%(self._name,self._breed)
clx = Guobaotegong('橙留香','橙子')
blcx = Guobaotegong('菠萝吹雪','菠萝')
lxg = Guobaotegong('陆小果','我不到啊')
print(clx)
print(blcx)
print(lxg)
Guobaotegong成员[ 橙留香, 品种是 橙子]
Guobaotegong成员[ 菠萝吹雪, 品种是 菠萝]
Guobaotegong成员[ 陆小果, 品种是 我不到啊]
(双下划线)repr(双下划线)(形参)方法,是在对某个对象用repr()函数的时候有效,效果在编译器中和str方法一样,但是在交互界面不一样,会和str方法有有无引号的区别。而且str方法使用只需要用print函数就行,但是repr方法需要同时调用repr函数。
上略
def __repr__(self):
return 'Guobaotegong成员[ %s, 品种是 %s]'%(self._name,self._breed)
print(repr(clx))
Guobaotegong成员[ 橙留香, 品种是 橙子]
比大小的方法有很多,用于解决不能直接用比较运算符比较大小的问题。比如object.(双下划线)lt(双下划线)(self, other)是小于,object.(双下划线)le(双下划线)(self, other)是小于等于,object.(双下划线)eq(双下划线)(self, other)是等于,object.(双下划线)ne(双下划线)(self, other)是不等于,object.(双下划线)gt(双下划线)(self, other)是大于,object.(双下划线)ge(双下划线)( self, other)是大于等于。
上略
def __lt__(self, other):
return self._name > other._name
print(clx > lxg)
print(lxg > clx)
True
False
(双下划线)bool(双下划线)(self)方法是用来返回结果布尔值的。
上略
def __bool__(self):
return True
print(bool(blcx))
True
其他还有很多,了解用处后使用就行。