zoukankan      html  css  js  c++  java
  • 面向对象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/

  • 相关阅读:
    每日一题_190921
    每日一题_190920
    每日一题_190919
    2017年江苏高考数学14题
    2017年全国高中数学联赛及2017年贵州省预赛试题
    高中数学与初中数学的接轨点
    从此错位(相减)无计算
    在 LaTeX 中同步缩放 TikZ 与其中的 node
    析构函数 一定是虚函数
    Java对多线程的支持
  • 原文地址:https://www.cnblogs.com/momo8238/p/7250932.html
Copyright © 2011-2022 走看看