组合:
解决类与类之间代码冗余问题有两种解决方案:1、继承,2、组合
1、继承:描叙的是类与类之间,什么是什么的关系
2、组合:描叙的是类与类之间的关系,是一种什么有什么的关系
一个类产生的对象,该对象拥有一个属性,这个属性的值来自于另外一个类的对象
封装:
1.什么是封装:
装就是把一堆属性存起来,封的概念就把这些属性给隐藏起来
如何把属性隐藏起来,就在属性前面加上__开头(注意不要加__结尾)
注意
其实这种隐藏只是一种语法上的变形,对外不对内
为一个属性名加__开头,会在类定义阶段将属性名统一变形:_自己的类名__属性名
class Foo: __x=11111 def __init__(self,y): self.__y=y def __f1(self): print('Foo.fi) obj=Foo(2000) obj.__f1() #报错 obj._Foo__f1() #Foo.f1
2.这种语法意义上变形,只在类定义阶段发生一次,类定义之后,新增的__开头的属性都没有变形的效果
3.如果父类不想让子类覆盖自己的方法,可以在方法名前加__开头
class Foo: def __f1(self) print('Foo.f1') def f2(self): print('Foo.f2'): self.__f1() class Bar(Foo): def __f1(self): print('Bar.f1') obj=Bra() obj.f2() #Foo.f2 #Foo.f1
为什么要用封装
封装函数属性的目的:把数据属性封装起来,然后需要开辟接口给外部的使用者使用,好处是我们可以在接口之上添加控制逻辑,从而严格控制访问者对属性的操作
class People: def __init__(self,name,age): self.__name=name self.__age=age def tell_info(self): u=input('user>>: ').strip() p=input('pwd>>: ').strip() if u == 'egon' and p == '123': print(self.__name,self.__age) p=People('egon',18) p.tell_info()
2.封装函数属性的目的:为了隔离复杂度