day21 学习小结

一、组合

什么是组合?

组合就是把对象的某个属性设置为另一个对象。

为什么要使用组合?

和继承一样,为了减少代码的冗余。

如何使用组合

class Teacher:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex


class Date:
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day

    def Tell_biirthday(self):
        print(f'''
        === 出身日期 ===
        年:{self.year}
        月:{self.month}
        日:{self.day}
        ===============
        ''')


teacher1 = Teacher('tbw',18,'boy')
birthday = Date(1997,8,14)

teacher1.birthday = birthday
teacher1.birthday.Tell_biirthday()

二、封装

什么是封装?

封装指的是把一堆属性(特征和技能)封装到一个对象中。

比喻:对象就好比一个袋子,袋子里装一堆属性。

为什么要封装?

封装的目的为了存取方便存取,可以通过 “对象.属性” 的方式获取属性。

如何封装

再类内部,定义一堆属性(特征与属性)

通过 “对象.属性”的方法取出属性值

特征:变量 ---》 数据属性

技能:函数 ---》 方法属性

三、访问限制机制

什么是访问限制机制?

在类内部定义属性,凡是以__开头的属性与方法属性,都会被python内部自动隐藏起来,让外部不能直接“直接”访问类内部的__开头的属性。

比如:

__name = 'tbw'  # 不能直接调用 类名.__name 这个属性,但可以用类内部的接口访问

为什么要有访问限制机制?

限制了一些机密属性被外界直接调用的可能性,使隐私的属性与不能被外部轻易访问的属性,可以隐藏起来,不能被外部直接调用。

(好处)对重要数据的获取的逻辑更加严谨,进而保证了数据的安全。

如何利用访问限制机制?

可以通过类内部的接口调用类内部的隐私数据(因为访问限制是针对外界调用类内部属性的一种措施,它并不禁止类内部的调用),可以在接口内进行一些逻辑判断,再把数据返回给调用者。

注意:在python中不会强制限制属性的访问,类内部__开头的属性

class ATM:
    # 1.插卡
    def __insert_card(self):
        print('插卡')
        pass

    # 2.输入密码
    def __input_pwd(self):
        print('密码验证')
        pass

    # 3.输入取款金额
    def __input_money(self):
        print('输入金额')
        pass

    # 4.开始吐钱
    def __get_money(self):
        print('执行吐钱')
        pass

    # 5.打印账单
    def __print_flow(self):
        print('打印账单')
        pass

    # 取钱直接接口
    def withdraw(self):
        self.__insert_card()
        self.__input_pwd()
        self.__input_money()
        self.__get_money()
        self.__print_flow()
        print('取款程序执行完毕!')


atm = ATM()
atm.withdraw()

'''
插卡
密码验证
输入金额
执行吐钱
打印账单
取款程序执行完毕!
'''

四、property

什么是property?

property是一种python内置的装饰器,主要是给类内部的按方法使用。

为什么要用property?

使用它的目的,是将类内部的方法“def 方法名+()” 变成了 “def 方法”,

从而使对象调用该方法时,把调用方式 "类名.方法名 + ()" 变成了 “类名.方法名”。

如何使用property?

直接在需要使用property装饰器的方法上面 @property ,和正常装饰器的使用方法一样。

'''
计算人体的bmi: bmi值 = 体重 / (身高 * 身高)


'''
class People:
    def __init__(self, name, weight, height):
        self.name = name
        self.weight = weight
        self.height = height

    @property
    def bmi(self):
        return self.weight / (self.height * self.height)

    # 了解
    @property
    def get_name(self):
        return self.name

    # 改
    @get_name.setter
    def set_name(self, val):
        self.name = val

    # 删除
    @get_name.deleter
    def del_name(self):
        del self.name


p = People('jason', 200, 1.6)
# print(p.bmi())  # 打印动词,看起来不合理
# print(p.bmi)  # ---> p.bmi()

# 注意: 不能对被装饰过的方法属性修改.
# p.bmi = 18


# 了解: 若真要通过此方法修改属性,可以通过另一种方式修改.
print(p.get_name)
p.set_name = 'tank'
print(p.get_name)
# p.del_name()
# print(p.get_name)
# del p.del_name
# print(p.get_name)



'''
jason
tank
'''

五、多态

什么是多态?

多态指的是同一种事物的多种形态,其实只是为类的定义设定一种规范,方法的形式可以使各种各样的,但他们的方法名必须一样。

多态的目的?

多态也称之为多态性, 在程序中继承就是多态的表现形式。

多态的目的是为了, 让多种不同类型的对象, 在使用相同功能的情况下,调用同一个名字的方法名。

父类: 定义一套统一的标准。

子类: 遵循父类统一的标准。

多态的最终目的: 统一子类编写的规范, 为了让使用者更方便调用相同功能的方法。

如何实现多态?

  • 继承就行了

注意:在python中,不会强制要求子类必须遵循父类的一套标准,所以出现了抽象类。

六、抽象类(了解)

什么是抽象类?

abc模块 (adstract_class模块)

使用抽象类的目的?

强制子类必须遵循父类的一套标准。

如何使用抽象类?

import abc

七、鸭子类型(了解)

什么是鸭子类型?

在不知道当前对象是何物的情况下,但是你长得像鸭子,那么你就是鸭子类型.

在python中,不推荐使用抽象类强制限制子类的定义,但是推荐类都遵循鸭子类型.

  • 继承:

    ​ 耦合性太高,程序的扩展性太差

  • 鸭子类型:

    ​ 耦合度低,程序的可扩展性强

猜你喜欢

转载自www.cnblogs.com/bowendown/p/11656834.html