面向对象-内置特殊方法-面向对象小结案例。
# 统计一个类被实例化多少次
# 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()也可以改成类方法