私有方法:
应用场景
- 在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到
- 私有属性:就是对象不希望公开的属性
- 私有方法:就是对象不希望公开的方法
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. 调用继承父类中的私有方法和私有属性