Python学习笔记(八)—— 私有属性、私有方法、伪私有

在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其在是在类的定义中。用下划线作为变量名和方法名的前缀和后缀来表示类的特殊成员。

  1. _xxx:这样的对象叫做保护成员,只有类对象和子类对象能访问这些成员。
  2. __xxx__:系统定义的特殊成员.
  3. __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()

小结:
既然时私有的,也不想让外界访问,所以,上述的方法不建议使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章