面向对象组合封装
Posted yang-sen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象组合封装相关的知识,希望对你有一定的参考价值。
组合
之前我们有了解继承是一种程序、软件的重用方式,但是除了继承之外还有一种方式可以让其重用的重要方式——组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
# class OldboyPeople:
# def __init__(self,name,age,sex):
# self.name=name
# self.sex=sex
# self.age=age
# def tell_info(self):
# print(‘‘‘
# ============个人信息===========
# 姓名:%s
# 年龄:%s
# 性别:%s
# ‘‘‘%(self.name,self.age,self.sex))
# class Teacher(OldboyPeople):
# def __init__(self,name,age,sex,salary,level):
# super().__init__(name,age,sex)
# self.salary=salary
# self.level=level
# def teach(self):
# print(‘%s 讲课‘%self.name)
# def tell_info(self):
# super().tell_info()
# print(‘‘‘
# 薪资:%s
# 级别:%s
# ‘‘‘%(self.salary,self.level))
#
# class Student(OldboyPeople):
# def choice(self):
# print(‘%s 选课‘%self.name)
#
# tea1=Teacher(‘egon‘,18,‘male‘,40,9)
# stu1=Student(‘alex‘,38,‘male‘)
#
# tea1.teach()
# tea1.tell_info()
# stu1.choice()
# stu1.tell_info()
组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,
1.继承的方式
通过继承建立了派生类与基类之间的关系,它是一种‘是‘的关系,比如白马是马,人是动物。
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人
2.组合的方式
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...
当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
继承是将程序之间的联系更加紧密,而组合则是和面向对象的原则很像,让它们之间耦合度变低
封装
封装从字面意思理解,装是将一堆属性存起来,封是将这些属性隐藏起来,但是这种理解方式比较片面
封装中隐藏的含义
隐藏的方法就是将属性的前面加上__开头(注意:没有__结尾)
#其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形 #类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self): self.__X=10 #变形为self._A__X def __foo(self): #变形为_A__foo print(‘from A‘) def bar(self): self.__foo() #只有在类内部才可以通过__foo的形式访问到. #A._A__N是可以访问到的, #这种,在外部是无法通过__x这个名字访问到
1、为一个属性名加__开头,会在类定义阶段将属性名变形
变形:_自己的类名__属性名(语法上的变形,不是真正的隐藏,对内不对外)
这种变形我们通过原属性名是肯定无法调用,但是使用变形后的属性名还是可以调用,但是这种调用没有丝毫意义
2、这种语法意义的变形,只在定义阶段发生一次,类定义之后,新增的__开头的属性不会产生效果
3、如果父类不想,让子类覆盖自己的方法,可以在方法名前加__开头
以上是关于面向对象组合封装的主要内容,如果未能解决你的问题,请参考以下文章