python中的垃圾回收及特殊方法

文章目录

垃圾回收

# 就像我们生活中会产生垃圾一样,程序在运行过程当中也会产生垃圾
# 程序运行过程中产生的垃圾会影响到程序的运行性能,所以这些垃圾必须被及时清理
# 没用的东西就是垃圾
# 在程序中没有被引用的对象就是垃圾,这种垃圾过多以后会影响程序的运行性能
#   所以我们必须进行及时的垃圾回收,所谓的垃圾回收就是将垃圾对象从内存中删除
# 在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__的魔法函数

猜你喜欢

转载自blog.csdn.net/adminstate/article/details/131254333
今日推荐