Python中的私有属性和私有方法

将给大家介绍什么是私有属性和私有方法,科普一下伪私有属性和方法,以及父类中的私有问题,子类该如何访问。


1.应用场景和定义方式

什么是私有?

对象的某些属性或者方法,只希望在对象的内部被使用,而不希望在外部被访问

通过案例具体给大家分析
这是没有含私有属性和私有方法的示例代码:
class Women:
    def __init__(self,name):
        self.name=name
        self.age=18
    def secrect(self):
        print(f"{self.name}的年龄是{self.age}")
women=Women("小芳")
print(women.age)
women.secrect()
输出结果:
18
小芳的年龄是18
  • 私有属性

私有属性格式:__属性名(两个下划线)
①对象外部无法访问私有属性
②对象内部可以访问私有属性(哪怕不同的方法)
class Women:
    def __init__(self,name):
        self.name=name
        self.__age=18          #age变成了私有属性
    
    def secrect(self):
        #在对象的方法内部是可以访问私有属性的
        print(f"{self.name}的年龄是{self.__age}")
        
women=Women("小芳")
women.secrect()
print(women.__age)   #报错,对象外部无法访问私有属性
输出结果:

小芳的年龄是18

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-4afb2cd2c9e2> in <module>
     10 women=Women("小芳")
     11 women.secrect()
---> 12 print(women.__age)

AttributeError: 'Women' object has no attribute '__age'

由上述代码发现:

①secrect方法中用了__init__方法内的__age私有属性,执行成功。

因为这个还是处于是对象内部,所以执行成功了。

②最后一行代码执行失败:在对象的外部调用了__age这个私有属性

  • 私有方法

私有方法:__方法名(两个下划线)
不允许外部直接访问
class Women:
    def __init__(self,name):
        self.name=name
        self.age=18
    def __secrect(self):     #secrect变成了私有方法
        print(f"{self.name}的年龄是{self.age}")
women=Women("小芳")
print(women.age)
women.__secrect()       #私有方法不允许在外界直接访问

输出结果:

18
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-2933e1335c76> in <module>
      8 women=Women("小芳")
      9 print(women.age)
---> 10 women.__secrect()

AttributeError: 'Women' object has no attribute '__secrect'

2.伪私有属性和私有方法(科普)

为什么说是伪私有?

python中,并没有真正意义上的私有!
实际上,是在给属性、方法命名时,对名称做了一些特殊处理,使得外界无法访问到。

如何访问私有?

处理方式:在名称前面加上 【_类名】→【_类名__属性/方法名称】

                                  类名前面是一个下划线,名称前面是两个下划线

'''访问私有'''
class Women:
    def __init__(self,name):
        self.name=name
        self.__age=18      #私有属性__age
   
    def __secrect(self):    #私有方法__secrect
        print(f"{self.name}的年龄是{self.__age}")

women=Women("小芳")
#__age 是伪私有属性,在外界不能够被直接访问,但是修改为 _Women__age 可以。
print(women._Women__age)
#__secrect是伪私有方法,同样不允许在外界直接访问,但是修改为 _Women__secrect 之后可以。
women._Women__secrect() 

输出结果:

18
小芳的年龄是18

3.子类对象不能直接访问父类的私有属性/调用私有方法

 首先定义一个类A,接下来的演示中,A类是父类。

在父类中,有一个私有属性【self.__num2=200】,有一个私有方法【__test(self)】

按照继承的概念,子类理应可以继承父类的方法和属性。

但私有方法和属性是否如此呢?

class A:
    def __init__(self):
        self.num1=100
        self.__num2=200      #私有属性
    def __test(self):             #私有方法
        print(f"私有方法:{self.num1} {self.__num2}")  

①在子类对象的方法中,不能访问父类的私有属性

②在子类对象的方法中,不能调用父类的私有方法

 

结果是不可以的。

4.通过父类的公有方法间接访问

由继承的概念可得,子类可以直接访问父类的公有属性/调用父类的公有方法

class A:
    def __init__(self):
        self.num1=100
        self.__num2=200      #私有属性
    def __test(self):             #私有方法
        print(f"私有方法:{self.num1} {self.__num2}")   
    def test(self):
        print("调用成功")
        
class B(A):
    def demo(self):
        print(f"访问父类的公有属性:{self.num1}")
        print("调用父类的公有方法:")
        self.test()
        
#创建一个子类对象
b=B()
b.demo()
访问父类的公有属性:100
调用父类的公有方法:
调用成功

所以,子类对象可以通过父类的公有方法间接访问 父类的私有属性和私有方法

class A:
    def __init__(self):
        self.num1=100
        self.__num2=200      #私有属性
    
    def __test(self):             #私有方法
        print(f"私有方法:{self.num1} {self.__num2}")   
    
    def test(self):
        print(f"父类的公有方法 访问 自己的私有属性 {self.__num2}")
        print("父类调用自己的私有方法:")
        self.__test()  
        

class B(A):
    def demo(self):
        pass
        
#创建一个子类对象
b=B()
b.test()
父类的公有方法 访问 自己的私有属性 200
父类调用自己的私有方法:
私有方法:100 200

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值