Python中的类属性及方法的私有化、继承

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(2print(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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值