zoukankan      html  css  js  c++  java
  • python面向对象<二>

    私有方法:

    应用场景

    • 在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到
    • 私有属性:就是对象不希望公开的属性
    • 私有方法:就是对象不希望公开的方法

    Python默认的成员函数和成员变量都是公开的,Python 私有属性和方法没有类似别的语言的public,private等关键词来修饰。
    在python中定义私有变量只需要在变量名或函数名前加上 "__"两个下划线,那么这个函数或变量就会为私有的了。
    声明该方法为私有方法,不能在类的外部调用

    class Send(object):
        # 私有方法
        def __send_msg(self):
            print('-------正在发送短信--------')
    
        # 公有方法
        def send_msg(self,money):
            if money >10000:
                self.__send_msg()
            else:
                print('余额不足,请充值,再发送短信')
    
    
    #私有方法:在方法面前加上两个'_'
    dog = Send()
    dog.send_msg(10000)
    >>> 余额不足,请充值,再发送短信
    
    dog = Dog()
    dog.send_msg(10000000)
    >>> -------正在发送短信-------- 

    __del__方法和测量引用计数:

    class Dog(object):
        def __del__(self):                           #当该对象在临死之前的操作
            print('------英雄over------')
    
    dog1 = Dog()
    dog2 = dog1
    del dog1                                          

    # 仅仅删除dog1指向Dog(),dog2依旧指向Dog()
    # 不会调用__del__方法,因为这个对象还有其他变量指向它(dog2),即 引用计数不是0
    # 如果在程序结束时,有些对像还存在,那么python解释器会自动调用他们的__del__方法来完成清理工作

    dog1 = Dog()
    dog2 = dog1
    del dog1                      #不会调用__del__方法,因为这个对象还有其他变量指向它(dog2),即 引用计数不是0
    del dog2                      #此时会调用__del__方法,因为没有变量指向它
    print('===============')
    >>>  ------over------
    >>>  ===============          #如果在程序结束时,有些对像还存在,那么python解释器会自动调用他们的__del__方法来完成清理工作 

    测量引用计数的方法:

    import sys
    class Dog(object):
        def __del__(self):
            print('------over------')
    
    dog1 = Dog()
    dog2 = dog1
    del dog1    
    res = sys.getrefcount(dog2)(得到的引用次数=目标次数-1)
    print(res)
    
    >>> 2
    >>>  ------over------ 

    私有方法、私有属性在继承中的表现:

    class A:
        def __init__(self):
            self.num1 = 100                  #公有属性
            self.__num2 = 200                #私有属性
    
        def test1(self):                     #公有方法
            print('----test1----')
    
        def __test2(self):                   #私有方法
            print('----test2----')
    
        def test3(self):
             self.__test2()
             print(self.__num2)
    
    class B(A):
        def test4(self):
             self.__test2()
             print(self.__num2)
    
    b= B()
    # b.test1()
    # b.__test2()                    #私有方法不会被继承下来
    # print(b.num1)                  #继承公有属性
    # print(b.__num2)                #不会继承公有属性
    b.test3()                        #如果在父类中调用私有属性和私有方法,可以调用私有属性和私有方法
    b.test4()                        #如果从父类中调用私有属性和私有方法,不可以调用私有属性和私有方法

    总结: 

    1. 如果调用的是继承父类中的公有方法
    2. 可以在这个公有方法中访问父类的私有属性和私有方法
    3. 但是如果在子类中实现一个公有方法,那么这个方法是不能
    4. 调用继承父类中的私有方法和私有属性

  • 相关阅读:
    JAVA基础--线程
    Flutter: SliverAppBar 应用程序栏与滚动视图集成,以便它可以根据滚动偏移量在高度上变化
    Flutter: MediaQuery
    Dart: puppeteer库
    Flutter: 监听App显示,隐藏
    Dart: 解析html字符串
    Dart: 编码和解码各种存档和压缩格式
    Dart: 执行shell命令
    运行Chrome浏览器如何添加Options
    Flutter 删除AppBar的返回icon
  • 原文地址:https://www.cnblogs.com/twoo/p/11750463.html
Copyright © 2011-2022 走看看