欢迎来到无荨的博客

想一千次,不如去做一次。如果自己不努力,那么这一辈子只可能在原地踏步!

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. 调用继承父类中的私有方法和私有属性

 

posted @ 2019-11-02 09:31  无荨  阅读(239)  评论(0编辑  收藏  举报