面向对象组合封装

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、如果父类不想,让子类覆盖自己的方法,可以在方法名前加__开头

 

以上是关于面向对象组合封装的主要内容,如果未能解决你的问题,请参考以下文章

python面向对象:组合封装property装饰器多态

面向对象之组合封装多态性鸭子类型

Java中面向对象的三大特性之封装

面向对象之:封装,多态

面向对象——继承与组合

面向对象组合封装