1.组合作用:
#减少代码的冗余
1️⃣继承描述的是类与类之间,什么是什么的关系
2️⃣组合:描述的是类和类之间的关系,是一种什么有什么的关系
一个类产生的对象,该对象拥有一个属性,
2.封装
1.什么是封装
装把一堆属性存起来,封的概念就是把这些属性隐藏起来
强调封装单从字面意思看就是隐藏,但其实封装绝对不是单纯意义的隐藏
2.为什么要用封装
3.如何用封装
#如何把属性隐藏起来,就是属性前面加上__开头(注意不要结尾)
注意:
1️⃣其实这种隐藏就是语法的变形,为一个属性名加一个__开头,会在类定义阶段(只检测函数内部的语法)将属性名变形:_自己的类名__属性名
class Foo:
__x=1111 #_Foo__x=1111
def __init__(self,y):
self.__y=y #self._Foo__y=y
def __f1(self):
print('Foo.f1')
def get_y(self):
print(self._y) #print(self._Foo__y)
obj=Foo()
#2.这种语法意义上的变形,只在定义类的阶段发生一次,类定义之后,新增的__开头的属性
3.如果父类不想让子类覆盖自己的方法,可以在方法名前加__开头
4.封装目的:
1️⃣封装属性的目的:把数据属性封装起来,然后需要开辟接口给类的外部使用者使用,好处是
我们可以在接口之上调价控制逻辑,从而严格空间访问者对属性的操作
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)
def set_info(self,name,age):
if type(name) is not str:
raise TypeError('用户名必须为str类型')
if type(age) is not int:
raise TypeError('年龄必须为int类型')
self.__name=name
self.__age=age
p=People('wss',18)
p.tell_info() #wss 18
p.set_info('WSS',19)
p.tell_info() #WSS 19
p.set_info(353535353535353535,20)#报错定义str类型的名字不可以是int类型
p.set_info('EGON','20') #定义int后的年龄不可以是字符串
2️⃣封装函数的目的:为了隔离复杂度
class ATM:
def __card(self):
print('插卡')
def __auth(self):
print('用户认证')
def __input(self):
print('输入取款金额')
def __print_bill(self):
print('打印账单')
def __take_money(self):
print('取款')
def withdraw(self):
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money()
obj=ATM()#调用类
obj.withdraw()
调用类里面的函数结果为:
插卡
用户认证
输入取款金额
打印账单
取款