首页 python基础教程 Python面向对象-统计类被实例化次数
pay pay

Python面向对象-统计类被实例化次数

日期: 2021年12月7日 15:38
栏目: python基础教程
阅读: 86
作者: python自学网

摘要: 通过前面几节课的内置方法学习,这节课来做个小案例熟悉一下前面的课程知识点,案例要求统计一个类被实例化了多少次。想实现这个功能,就需要知道对象被初始化多少次和被释放多少次。

通过前面几节课的内置方法学习,这节课来做个小案例熟悉一下前面的课程知识点,案例要求统计一个类被实例化了多少次。想实现这个功能,就需要知道对象被初始化多少次和被释放多少次。下面就来演示一下。

1.使用生命周期方法实现统计对象个数

num = 0
class Student(object):
    def __init__(self):
        global num  # 引入全局变量,方便在外面直接查看对象个数
        print('增加了一个实例对象')
        num += 1

    def __del__(self):
        global num
        print('删除了一个实例对象')
        num -= 1


s = Student()  # 显示增加一个实例,但是执行完之后会被释放
print(num)
del s  # 自动调用类中__del__方法
print(num)

2.通过函数实现统计功能

num = 0
class Student(object):
    def __init__(self):
        global num  # 引入全局变量,方便在外面直接查看对象个数
        print('增加了一个实例对象')
        num += 1

    def __del__(self):
        global num
        print('删除了一个实例对象')
        num -= 1

    def total(self):  # 通过方法来显示最终对象个数
        global num
        print(num)

s1 = Student()  # 显示增加一个实例,但是执行完之后会被释放
s2 = Student()
s1.total()
del s1  # 自动调用类中__del__方法
# s1.total()  # NameError: name 's1' is not defined;实例被删除,所以这种调用不好,total()改查静态方法

3.通过静态方法实现统计

num = 0
class Student(object):
    def __init__(self):
        global num  # 引入全局变量,方便在外面直接查看对象个数
        print('增加了一个实例对象')
        num += 1

    def __del__(self):
        global num
        print('删除了一个实例对象')
        num -= 1

    @staticmethod
    def total():  # 通过方法来显示最终对象个数
        global num
        print(num)

s1 = Student()  # 显示增加一个实例,但是执行完之后会被释放
s2 = Student()
Student.total()  # 静态方法使用Student类调用就不会报错了
del s1  # 自动调用类中__del__方法
Student.total()  # 使用类调用静态方法,不会报错
# 但是这时候num是全局变量只要赋值就会改变其值
num = 100
s3 = Student()
Student.total()  # 这里编程101个
# 需要把num变成类属性,才能解决,注意不要变成实例属性,

4.代码改进

class Student(object):
    __num = 0
    def __init__(self):
        print('增加了一个实例对象')
        # num += 1  # 访问类属性错误
        Student.__num += 1

    def __del__(self):
        print('删除了一个实例对象')
        self.__class__.__num -= 1  # 和上面的Student.num += 1一样作用

    # @staticmethod
    # def total():
    #     print(Student.__num)

    @classmethod
    def total(cls):
        print(cls.__num)

s1 = Student()
s2 = Student()
Student.total()
del s1
Student.total()
# 但是这里我们在外界任然能访问公有属性num,也可以修改,所以要把num变成私有属性__num
# total()也可以改成类方法

 

目录
回顶部