在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其在是在类的定义中。用下划线作为变量名和方法名的前缀和后缀来表示类的特殊成员。
_xxx
:这样的对象叫做保护成员,只有类对象和子类对象能访问这些成员。__xxx__
:系统定义的特殊成员.__xxx
:类中的私有成员,只有类对象自己能访问,子类对象也不能访问这个成员,但在对象的外部可以通过“对象名._类名__xxx
”这样的特殊方式来访问。Python中不存在严格意义上的私有成员。
私有属性和私有方法
对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问。
格式:
在属性名或者方法名前增加两个下划线
class Women:
def __init__(self,name):
self.name = name
self.__age = 20
def secret(self):
'''在对象的方法内部,可以访问对象的私有属性'''
print("%s的年龄是%d"%(self.name,self.__age))
def __secret1(self):
print("%s的年龄是%d"%(self.name,self.__age))
danni = Women("小美")
# 私有属性,在外界不能被直接访问,否则程序会报错。
#print(danni.__age)
danni.secret()
#私有方法,同样不允许在外界直接访问
danni.__secret1()
父类的私有属性和私有方法
1.子类对象不能在自己的方法内部,直接访问父类的私有属性或私有方法
class A:
def __init__(self):
self.num1 = 1
self.__num2 = 2
def __test(self):
print("私有方法")
class B(A):
def demo(self):
# 1.在子类的对象方法中,不能访问父类的私有属性
print("访问父类的私有属性%d" %self.num2)
# 2.在子类内部不能调用父类的私有方法
self.__test()
c = B()
c.demo()
报错
2.子类对象可以通过父类的公有方法间接访问到私有属性或私有方法。
class A:
def __init__(self):
self.num1 = 1
self.__num2 = 2
def __test(self):
print("父类的私有方法")
def test(self):
'''在自己的公有方法中调用自己的私有属性'''
print("公有方法")
print(self.__num2)
self.__test()
class B(A):
def demo(self):
# 访问父类的公有属性
print("子类方法%d" % self.num1)
# 调用父类法公有方式
self.test()
c = B()
c.demo()
结果:
子类方法1
公有方法
2
父类的私有方法
但是很想访问私有成语怎么办???
伪私有
在名称前面加_类名
即变成了_类名__名称
。名称指的是属性或者方法
class Women:
def __init__(self,name):
self.name = name
self.__age = 20
def secret(self):
'''在对象的方法内部,可以访问对象的私有属性'''
print("%s的年龄是%d"%(self.name,self.__age))
def __secret1(self):
print("%s的年龄是%d"%(self.name,self.__age))
danni = Women("小美")
# 私有属性,在外界不能被直接访问
print(danni._Women__age)
danni.secret()
#私有方法,同样不允许在外界直接访问
danni._Women__secret1()
小结:
既然时私有的,也不想让外界访问,所以,上述的方法不建议使用。