昨日回顾

继承

什么是继承

新建类的方式,新建的类叫子类/派生类,被继承的类叫做父类/基类/超类

继承是一系列相同的属性的类的结合体

继承的目的

让代码不冗余

什么是抽象

抽取相似部分

继承背景下,对象属性的查找顺序

  1. 对象
  2. 子类
  3. 父类

派生

什么是派生

派生是指子类继承父类的属性,并且派生出自己的属性

若子类的属性和父类的属性相同时,以子类的为准

子类派生出新的属性,重用父类的属性

  1. 直接调用父类的init函数,当作普通函数传入对象和继承的属性
  2. super()指向父类名

新式类和经典类

  1. 继承object的类以及子类都叫新式类
  2. 没有继承object的类以及子类都叫经典类
  3. python3中默认继承object,即python3中都是新式类,只有python2中才有经典类

钻石继承的继承顺序

  1. 新式类

    广度优先

  2. 经典类

    深度优先

今日内容

一、组合

1. 什么是组合

组合指的是一种对象的中属性,是另一个对象

组合是指对象和对象的关系

2. 组合的作用

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

3. 如何使用组合

class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.course_list = []

    def add_course(self,course):
        self.course_list.append(course)

    def tell_all_course(self):
        for course in self.course_list:
            course.tell_course()

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

class Course:
    def __init__(self,course_name,course_period,course_price):
        self.course_name = course_name
        self.course_period = course_period
        self.course_price = course_price

    def tell_course(self):
        print(f'''
        课程名称:{self.course_name}
        课程周期:{self.course_period}
        课程价格:{self.course_price}''')

tea = Teacher('wick',24,'man')

python = Course('python',6,20000)
tea.add_course(python)
tea.tell_all_course()  

# 课程名称:python
# 课程周期:6
# 课程价格:20000

二、封装

1. 什么是封装

封装指的是把一堆属性封装到一个对象中,对象可以通过"."的方式获取属性

2. 为什么要封装

方便存取,通过对象“.”属性的方式获取属性

3. 如何封装

  1. 在类内部,定义一堆属性
  2. 通过对象的赋值操作封装

4. 访问限制机制

在类内部定义的,凡是以__开头的属性都会被隐藏,外部不能直接访问该属性

访问限制机制的目的

  • 把一堆隐私的属性与不能被外部轻易访问的属性,可以隐藏起来,不被外部直接调用

  • 好处:对数据获取的逻辑更加严谨,进而保护了数据的安全

  • 隐私属性可以通过封装一个接口,在接口内做业务逻辑,再把数据返回给调用者

    class Teacher:
        def __init__(self, name, age, sex):
            self.__name = name
            self.__age = age
            self.__sex = sex
    
        # 接口: 打印用户信息接口
        def get_info(self):
            # 用户认证
            user = input('user: ').strip()
            pwd = input('pwd: ').strip()
            if user == 'tank' and pwd == '123':
                print(f'''
                姓名: {self.__name}
                年龄: {self.__age}
                性别: {self.__sex}
                ''')
    
        # 接口: 修改用户信息接口
        def set_info(self, name, age, sex):
            # str1 = 'string'  # str('string')
            if not isinstance(name, str):
                raise TypeError('名字必须要使用字符串')
    
            if not isinstance(age, int):
                raise TypeError('年龄必须是数字')
    
            if not isinstance(sex, str):
                raise TypeError('性别必须要使用字符串')
    
            self.__name = name
            self.__age = age
            self.__sex = sex
    
    tea1 = Teacher('tank', 17, 'male')
    tea1.set_info('jason_sb', 101, 'female')
    tea1.get_info()
    
    # demo3: ATM
    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()
    

注意:python中不会强制限制属性的访问,类内部__开头的属性只是做了一个变形,通过访问变形后的名字就可以访问该属性 __属性名 变形名 __类名__属性

三、property特性

1. 什么是property

python内置装饰器,主要是给类内部的方法使用

2. 为什么用property

使用它的目的,是将类内部的函数变成数据属性,从而在调用的时候不用加括号

3. 如何使用property

装饰器放在被装饰函数上一行

注意:被装饰过的属性不能被修改,如果非要修改可以用装饰器中的setter和deleter进行删改

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.get_name)
p.set_name = 'tank' # 固定格式
del p.del_name # 固定格式

四、多态

1. 什么是多态

多态是指同一种事物的多种形态

2. 多态的目的

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

  2. 让多种不同类型的对象,在使用在相同功能的情况下,调用同一个名字的方法名

  3. 父类:定义一套统一的标准

  4. 子类:定义父类统一的标准

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

3. 如何实现

1. 继承

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

2. 抽象类(了解)

abc模块(abstract_class)强制子类必须遵循父类的标准

import abc
class Animal(metaclass=abc.ABCMeta):
    # 吃
    @abc.abstractmethod
    def eat(self):
        pass

    # 喝
    @abc.abstractmethod
    def drink(self):
        pass

    # 叫
    @abc.abstractmethod
    def speak(self):
        pass

# 猪
class Pig(Animal):
    # 吃
    def eat(self):
        print('猪在吃饭')
        pass

    # 喝
    def drink(self):
        pass

    def speak(self):
        print('哼哼哼~~~')

    # 派生
    def run(self):
        pass

pig = Pig()

五、鸭子类型

  1. 在不知道当前对象是何物是,它如果像鸭子,那就是鸭子类型

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

继承

​ 耦合性太高,扩展性差

鸭子类型:

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

六、多态之炫技

比如len函数的实现

#  数据类型中含有__len__的属性,定义了LEN的函数返回出每个对象的__len__,从而达到多态性
str1 = '1234'
list1 = [1, 2, 3]

def LEN(d):
    return d.__len__()

print(LEN(str1))
print(LEN(list1))

组合+封装+property+多态+鸭子类型(day21)的更多相关文章

  1. python之类的多态(鸭子类型 )、封装和内置函数property

    一.多态 1.什么是多态:一个类表现出的多种状态--->通过继承来实现的例如:class Animal:passclass Dog(Animal):passclass Cat(Animal):p ...

  2. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  3. 面向对象—多态、鸭子类型(Day21)

    编程原则java具有自己的编程原则和设计模式,不能多继承.python的编程原则:1.开放封闭原则:开放是对扩展是开放的,封闭是对修改是封闭的(已经写完的代码程序是不能修改的).2.依赖倒置原则:高层 ...

  4. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  5. day 28 面向对象 三种特性之一 多态 鸭子类型 反射(反省)

    多态是OOP的三大特征之一 字面意思:多种形态 多种状态 官方描述:不同的对象可以响应(调用)同一个方法 产生不同的结果(例如水的三相特征) 多态不是什么新技术 我们编写面向对象的程序时 其实就有多态 ...

  6. 封装之property,多态,鸭子类型,classmethod与staticmethod

    一.封装之Property prooerty是一种特殊的属性,访问时他会执行一段功能(函数)然后返回 '''BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属 ...

  7. 面向对象之组合、封装、多态、property装饰器

    概要: 组合 封装 property装饰器 多态 Python推崇鸭子类型:解耦合,统一标准(不用继承) 1. 组合 继承:会传递给子类强制属性 组合:解耦合,减少占用内存.如:正常继承,如果一个班级 ...

  8. 面向对象之 组合 封装 多态 property 装饰器

    1.组合 什么是组合? 一个对象的属性是来自另一个类的对象,称之为组合 为什么要用组合 组合也是用来解决类与类代码冗余的问题 3.如何用组合 # obj1.xxx=obj2''''''# class ...

  9. Python 面向对象 组合-多态与多态性-封装-property

    面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...

随机推荐

  1. jenkins自动化部署项目9 --定时构建

    举几个例子:每隔5分钟构建一次H/5 * * * * 每两小时构建一次H H/2 * * * 每天中午12点定时构建一次H 12 * * * 每天下午18点定时构建一次H 18 * * * 在每个小时 ...

  2. 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

    目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接 ...

  3. 前端面试题——html与css基础篇

    整理一波html和css的面试题,侧重基础,希望明天面试能用到~(╥╯^╰╥) 一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.C ...

  4. 不知道如何实现服务的动态发现?快来看看 Dubbo 是如何做到的

    上篇文章如果有人问你 Dubbo 中注册中心工作原理,就把这篇文章给他大致了解了注册中心作用以及 Dubbo Registry 模块源码,这篇文章将深入 Dubbo ZooKeeper 模块,去了解如 ...

  5. Django之使用celery和NGINX生成静态页面实现性能优化

    性能优化原理: 当我们要给client浏览器返回一个页面时,我们需要去数据库查询数据并将数据和基本页面模板渲染形成页面返回给客户端,但如果每一个用户访问时都去查询一次首页的的数据时,当日访问量很大时那 ...

  6. MySQL中日期和时间戳互相转换的函数和方法

     时间戳转换成日期 复制代码代码如下: FROM_UNIXTIME 例如: 数据表中 invest_time 存储的是时间戳,如 1429063399 使用 FROM_UNIXTIME 可以把时间戳转 ...

  7. Java 学习笔记之 JVM初识

    JVM初识: java只是启动JVM的命令.JVM真实位置: C:\Program Files\Java\jdk1.8.0_121\jre\bin\server\jvm.dll 1. 第一行JDK版本 ...

  8. Curl的移植编译以及注意事项

    最近需要用curl来发送http请求,遇到了不少问题,查了不少资料,都是零零散散的,现在总结下.   1.移植编译 ./configure --prefix=$(PWD)/build --host=a ...

  9. CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算?

    CSS 选择符有哪些? 1.id选择器(#id) 2.类选择器(.class) 3.标签选择器(div,h1,p) 4.相邻选择器(h1 + p) 5.子选择器(ul > li) 6.后代选择器 ...

  10. Dubbo学习系列之十五(Seata分布式事务方案TCC模式)

    上篇的续集. 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1 ...