标签:python python面向对象 面向对象多态、封装特性
多态总结:以单下划线或双下划线命名的属性,只是一种约定,并不是说python一定不能访问。实际上,python并不会真的阻止你访问私有的属性,模块也是这种约定。
那么,子类继承父类后,子类是否可以访问父类私有的属性呢?见下图:
封装的第三个层面:明确区分内外,内部的实现逻辑,外部无法知晓,并且为封装到内部的逻辑他提供一个访问接口给外部使用(这才是真正的封装),封装的含义就是将类内部的属性隐藏起来,但是外部如果要使用它怎么办?这是就用到了第三个层面的封装了,我们可以在类的类别定义一个函数调用双下划线的属性,这样我们通过调用这个函数就可以间接的访问类中隐藏的属性了。改写上面的例子,见下图:
该部分的代码块为:
class School():
price = 12000
__leadteacher = "刘昌明" #双下划线开头的数据属性
def __init__(self,name,addr,type):
self.name = name
self.addr = addr
self.type = type
def showinfo(self):
print("%s位于%s,是一所%大学,学费是%s"%(self.name,self.addr,self.type,self.price))
def __activy(self):
print("学校正在举办书法比赛")
def returninfo(self): #通过类中的函数来访问隐藏的属性,以供外部调用,这才是真正意义上的封装
print("这个学校的现在是%s"%self.__leadteacher)
self.__activy()
# class Student(School):
# print(School.__leadteacher)
s1 =School("长江大学","湖北省荆州市","国立一本")
#直接在外部访问类的数据属性
# print(s1.price)
# print(s1.__leadteacher) #报错
# print(s1._leadteacher) #报错
#直接在外部访问类的函数属性
# s1.__activy() #报错
#打印类的属性字典
# print(School.__dict__)
#再次访问类的内部属性
# print(s1._School__leadteacher)
# s1._School__activy()
# student = Student()
#通过类中的接口函数来访问类中隐藏的属性
s1.returninfo()
标签:python python面向对象 面向对象多态、封装特性
原文地址:http://blog.51cto.com/10836356/2109167