python中类属性和方法的私有化
1. 类属性私有化
在python中并未存在私有化属性关键字:public、private。默认为公有化属性和方法,为了完成属性和方法的私有化,其约定遵循通过一定 的属性和方法命名规约来达到这个效果。
1.约定以下划线开头的名字都应该是内部的实现。
2.当使用双下划线‘_ _’时,则表明其为实例的私有属性或者私有方法,当私有属性被访问时,只能通过共有类方法进行访问。
class B:
def __init__(self,value=0):
self.__private = value
def __private_method(self):
print(self.__private)
def public_method(self):#通过共有方法访问私有属性
self.__private_method()
使用双下划线开始会导致访问名称变成其他形式。比如,在前面的类B 中,私有属性会被分别重命名为_B__private 和_B__private_method 。这时候你可能会问这样重命名的目的是什么,答案就是继承——这种属性通过继承是无法被覆盖的。
在进行实例化时,实例对象调用私有化属性或者方法会有如下显示:
b=B(2)
print(b.__private)
将会提示属性错误 :AttributeError: ‘B’ object has no attribute ‘__private’
2.私有属性的继承
class C(B):
def __init__(self):
super().__init__()
self.__private = 1 # 并未覆盖 B.__private
# 并未覆盖 B.__private_method()
def __private_method(self):
pass
1.在继承过程中,C类会继承B类的public_method(),这里,私有名称__private 和__private_method 被重命名为_C__private 和_C__private_ method ,这个跟父类B 中的名称完全不同。
2.在通过C类的实例调用public_method()时, 由于未对public_method()进行覆写,其__private实际为_B__private,并将会输出B类中的__private属性值。
3.在子类中调用父类的某个已经被覆盖的方法
对于已经被覆盖的父类方法,无法通过方法名字调用,此时采用super().父类方法名字,进行调用。
class A:
def spam(self):
print('A.spam')
class B:
def spam(self):
print('B.spam')
super().spam()