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