赞
踩
将给大家介绍什么是私有属性和私有方法,科普一下伪私有属性和方法,以及父类中的私有问题,子类该如何访问。
对象的某些属性或者方法,只希望在对象的内部被使用,而不希望在外部被访问
- 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'
类名前面是一个下划线,名称前面是两个下划线
- '''访问私有'''
- 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
首先定义一个类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}")
结果是不可以的。
由继承的概念可得,子类可以直接访问父类的公有属性/调用父类的公有方法
- 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
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。