当前位置:   article > 正文

Python中的私有属性和私有方法_python 私有对象属性

python 私有对象属性

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


1.应用场景和定义方式

什么是私有?

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

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

私有属性格式:__属性名(两个下划线)
①对象外部无法访问私有属性
②对象内部可以访问私有属性(哪怕不同的方法)
  1. class Women:
  2. def __init__(self,name):
  3. self.name=name
  4. self.__age=18 #age变成了私有属性
  5. def secrect(self):
  6. #在对象的方法内部是可以访问私有属性的
  7. print(f"{self.name}的年龄是{self.__age}")
  8. women=Women("小芳")
  9. women.secrect()
  10. 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这个私有属性

  • 私有方法

私有方法:__方法名(两个下划线)
不允许外部直接访问
  1. class Women:
  2. def __init__(self,name):
  3. self.name=name
  4. self.age=18
  5. def __secrect(self): #secrect变成了私有方法
  6. print(f"{self.name}的年龄是{self.age}")
  7. women=Women("小芳")
  8. print(women.age)
  9. 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中,并没有真正意义上的私有!
实际上,是在给属性、方法命名时,对名称做了一些特殊处理,使得外界无法访问到。

如何访问私有?

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

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

  1. '''访问私有'''
  2. class Women:
  3. def __init__(self,name):
  4. self.name=name
  5. self.__age=18 #私有属性__age
  6. def __secrect(self): #私有方法__secrect
  7. print(f"{self.name}的年龄是{self.__age}")
  8. women=Women("小芳")
  9. #__age 是伪私有属性,在外界不能够被直接访问,但是修改为 _Women__age 可以。
  10. print(women._Women__age)
  11. #__secrect是伪私有方法,同样不允许在外界直接访问,但是修改为 _Women__secrect 之后可以。
  12. women._Women__secrect()

输出结果:

18
小芳的年龄是18

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

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

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

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

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

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

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

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

 

结果是不可以的。

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

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

  1. class A:
  2. def __init__(self):
  3. self.num1=100
  4. self.__num2=200 #私有属性
  5. def __test(self): #私有方法
  6. print(f"私有方法:{self.num1} {self.__num2}")
  7. def test(self):
  8. print("调用成功")
  9. class B(A):
  10. def demo(self):
  11. print(f"访问父类的公有属性:{self.num1}")
  12. print("调用父类的公有方法:")
  13. self.test()
  14. #创建一个子类对象
  15. b=B()
  16. b.demo()
访问父类的公有属性:100
调用父类的公有方法:
调用成功

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

  1. class A:
  2. def __init__(self):
  3. self.num1=100
  4. self.__num2=200 #私有属性
  5. def __test(self): #私有方法
  6. print(f"私有方法:{self.num1} {self.__num2}")
  7. def test(self):
  8. print(f"父类的公有方法 访问 自己的私有属性 {self.__num2}")
  9. print("父类调用自己的私有方法:")
  10. self.__test()
  11. class B(A):
  12. def demo(self):
  13. pass
  14. #创建一个子类对象
  15. b=B()
  16. b.test()
'
运行
父类的公有方法 访问 自己的私有属性 200
父类调用自己的私有方法:
私有方法:100 200

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/903616
推荐阅读
相关标签
  

闽ICP备14008679号