面向对象3-析构函数和私有属性
1 析构函数:在实例释放,销毁的时候自动执行的。通常用于做一些收尾工作,如关闭一些数据库链接,关闭一些打开的临时文件等。释放内存。
Python的自动回收机制:隔一段时间,Python会扫描内存中那些没有被变量引用的值(有没有门牌号),如果没有被任何一个变量引用的话,就会自动删除。
class Person:
cn="China"
def __init__(self,name,age):
self.name=name
self.age=age
def got_shot(self):
print("ah...,I got shot...")
def __del__(self): #析构函数,不能传任何参数
print("彻底玩完了,析构函数执行")
p1=Person('Lily',22)
p1.got_shot()
p2=Person('Jack',22)
p2.got_shot()
执行结果:
ah...,I got shot...
ah...,I got shot...
Lily彻底玩完了,析构函数执行
Jack彻底玩完了,析构函数执行
2.用del主动释放内存, del 删除的是变量名(门牌号)。不是内存。当发现某个变量没有被引用时(没有门牌号了),这块内存才会被清除。
class Person:
cn="China"
def __init__(self,name,age):
self.name=name
self.age=age
def got_shot(self):
print("ah...,I got shot...")
def __del__(self): #析构函数,不能传任何参数
print("%s彻底玩完了,析构函数执行"%self.name)
p1=Person('Lily',22)
p1.got_shot()
del p1
p2=Person('Jack',22)
p2.got_shot()
运行结果:
ah...,I got shot...
Lily彻底玩完了,析构函数执行
ah...,I got shot...
Jack彻底玩完了,析构函数执行
3.私有属性:通过p1.age可以任意修改P1的年纪,现在想办法使它变成一个私有属性。
私有属性和私有方法一样,都是在前面加两个小下划线就可以了。
__self.name=name
__got_shot(self):
class Person:
cn="China"
def __init__(self,name,age):
self.name=name
self.age=age
def got_shot(self):
print("ah...,I got shot...")
p1=Person('Lily',22)
p1.age=23
print(p1.age)
p2=Person('Jack',22)
把age改成私有属性以后,居然还可以正常赋值以及执行。郁闷啊啊啊啊啊啊啊啊啊啊-------------------,已经通过博问解决。参照最下面的截图。
class Person:
cn="China"
def __init__(self,name,age):
self.name=name
self.__age=age
def got_shot(self):
print("ah...,I got shot...")
p1=Person('Lily',22)
p1.__age=23
print(p1.__age)
p2=Person('Jack',22)
运行结果:
23
4.如何从外部访问私有属性:
class Person:
cn="China"
def __init__(self,name,age):
self.name=name
self.__age=age
def got_shot(self):
print("ah...,I got shot...")
p1=Person('Lily',22)
#p1.__age=23
print(p1.__age)
p2=Person('Jack',22)
运行结果:
Traceback (most recent call last):
File "C:/abccdxddd/Oldboy/Py_Exercise/Day6/aaa.py", line 11, in <module>
print(p1.__age)
AttributeError: 'Person' object has no attribute '__age'
那么怎么样从外部去访问私有属性呢?在内部定义了一个方法 show_status(self):
class Person:
cn="China"
def __init__(self,name,age):
self.name=name
self.__age=age
def got_shot(self):
print("ah...,I got shot...")
def show_status(self):
print("age is: %s"%self.__age)
p1=Person('Lily',22)
p1.show_status()
运行结果:
age is: 22
关于私有属性的博问:https://q.cnblogs.com/q/97004/



浙公网安备 33010602011771号