昨日回顾

继承

什么是继承

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

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

继承的目的

让代码不冗余

什么是抽象

抽取相似部分

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

  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. video.js 使用中抛出异常:DOMException: "'#1098942864706113536' is not a valid selector"

    原因:video.js 在获取页面元素时使用的是querySelector方法,由于querySelector是按css规范来实现的,所以它传入的字符串中第一个字符不能是数字. 解决:元素Id在赋值时 ...

  2. elasticsearch应用于产品列表

    package com.linkwee.web.service; import java.util.List; import com.linkwee.api.request.cim.ProductPa ...

  3. 前端获取后台传输过来是数据 {张三:12} 解析为[object object],获取其中内容

    昨天遇到前端传输过来的数据为[{张三:12},{李四:23}],后台用的是map格式,我在前端js中暂未找到直接调用对象内容的方法,故利用以下方法来获取: $.each(data.data,funct ...

  4. MYSQL-用户密码修改

    解决方法如下:1.终端中结束当前正在运行的mysql进程.# sudo /etc/init.d/mysql stop2.用mysql安全模式运行并跳过权限验证.# sudo /usr/bin/mysq ...

  5. 【ADO.NET基础】后台获取前台控件

    C# 后台获取前台 input 文本框值.string aa=Request.Form[headself]; 那么要是后台给前台input文本框赋值呢? 后台 public string Headse ...

  6. Docker系列(四):容器之间的网络通信

    首先我们需要知道:两个容器要能通信,必须要有属于同一个网络的网卡. 先来看下正常情况下我们的容器默认是否是能通信的,这里运行两个测试容器: docker run -it --name=bbox1 bu ...

  7. Disruptor—核心概念及体验

    本文基于最新的3.4.2的版本文档进行翻译,翻译自: https://github.com/LMAX-Exchange/disruptor/wiki/Introduction https://gith ...

  8. SSM相关知识

    1.SpringMVC的工作流程? 1. 用户发送请求至前端控制器DispatcherServlet 2. DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3 ...

  9. IDEA 学习笔记之 Java项目开发

    Java项目开发: 新建模块: 添加JDK: 导入本地Jars: 从远程Maven仓库下载: 创建package: 新建类/接口/枚举等: 字体太小,改字体: Duplicate Scheme 修改编 ...

  10. TCP三次握手和四次握手全过程 为什么要三次握手而不是二次握手?

    三次握手 第一次握手: 客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送 ...