垃圾回收
# 就像我们生活中会产生垃圾一样,程序在运行过程当中也会产生垃圾
# 程序运行过程中产生的垃圾会影响到程序的运行性能,所以这些垃圾必须被及时清理
# 没用的东西就是垃圾
# 在程序中没有被引用的对象就是垃圾,这种垃圾过多以后会影响程序的运行性能
# 所以我们必须进行及时的垃圾回收,所谓的垃圾回收就是将垃圾对象从内存中删除
# 在Python中有自动的垃圾回收机制,它会自动将这些没有被引用的对象删除,
# 所以我们不用手动处理垃圾回收
class A:
def __init__(self):
self.name = 'A类'
# del是一个特殊方法,它会在对象被垃圾回收前调用,类似于C++语言中的析构函数,在对象被删除前调用
def __del__(self):
print("A()对象被删除了~~~~~", self)
a = A()
print(a.name)
b = a # 又用一个变量b,来引用a对应的对象
# a = None # 如果在没将a赋值给b的情况下,将a设置为了None,相当于C++语言中的将指针变量赋值为NULL,此时没有任何的变量对A()对象进行引用,它就变成了垃圾
# b = None
del a # 删除变量a,而不是删除的对象,删除变量a,此时对A()对象的引用次数减一
del b # 删除变量b,此时对A()对象的引用次数再减一,变为了零。所以次数A()对象就是垃圾,会被自动回收
input('回车键退出.....') # 目的演示在程序退出前对象被回收 和 演示在程序退出时被强制删除回收
特殊方法
# 特殊方法,也称为魔术方法
# 特殊方法都是使用__开头和结尾的
# 特殊方法一般不需要我们手动调用,需要在一些特殊情况下自动执行
# 定义一个Person类
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
# __str__()这个特殊方法会在尝试将对象转换为字符串的时候调用
# 它的作用可以用来指定对象为字符串的结果
# 重写默认的__str__方法
def __str__(self):
return 'Person[name=%s, age=%s]' % (self.name, self.age)
# __repr__() 这个特殊方法会在对当前对象使用repr()函数时调用
# 它的作用是指定对象 在 '交互模式下(IDLE)'中直接会变量名回车输出的效果,而上面的__str__()函数是在调用print()打印对象时自动调用。
def __repr__(self):
return 'Hello'
# 对象中的特殊比较的方法
# object.__lt__(self,other) 小于 <
# object.__le__(self,other) 小于等于 <=
# object.__eq__(self,other) 等于 =
# object.__ne__(self,other) 不等于 !=
# object.__gt__(self,other) 大于 >
# object.__ge__(self,other) 大于等于 >=
# 以object.__gt__(self,other)为例
# __gt__会在对象做大于比较的时候调用,该方法的返回值将会作为比较的结果
# 它需要两个参数,一个self表示当前对象,other表示和当前对象比较的对象
def __gt__(self, other):
return self.age > other.age
# __len__()获取对象的长度
# object.__bool__(self)
# 可以通过bool来指定对象转换为布尔值的情况
def __bool__(self):
return self.age > 17
#还有用于类中加·减·乘·除的特殊方法就不一一列举了
# object.__add__(self,other) #加法运算
#........
执行测试:
# 创建两个Person类的实例
p1 = Person('孙悟空', 18)
p2 = Person('猪八戒', 28)
# 打印p1
# 当我们打印对象时,实际上是打印的对象中(其实是从object那里继承过来的)的特殊方法__str__()的返回值,默认是打印对象的内存地址的字符串,可以被重写
print(p1) # 相当于print(str(p1))
print(p2)
ret = p1 > p2 # 类似于C++中的符号重载,在类中如果没有定义__gt__方法,两个对象直接比较会报错。如果在类中定义了__gt__()函数,则自动调用类中的__gt__(p1,p2)
print(ret)
ret = p2 > p1
print(ret)
print(bool(p1)) # bool(p1)自动调用类中定义的__bool__的魔法函数