默认类型

class A:

    class_name = 'python23期'

    def __init__(self, name, age):

        self.name = name
self.age =age a1 = A('李业', 21) # 实例化一个a1的对象
print(a1.name) a2 = A('李东宇', 24) # 实例化一个a2的对象
print(a2.age)

封装

把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了⼀个很⽜B的函数. 那这个也可以被称为封装. 在⾯向对象思想中. 是把⼀些看似⽆关紧要的内容组合到⼀起统⼀进⾏存储和使⽤. 这就是封装.

多态

一个事务有多种形态 比如水

什么是多态: 在python中默认支持多态,就是a可以定义多种数据类型,不用规定其所属的数据类型,可以是字符串,列表,元组等任意数据类型

python中定义变量不用规定变量的类型
a = 'alex'
a = [1, 2, 3]
a = (22, 33) Java
int a = 12 # a必须是整型
String b = 'abc'# b必须是一个字符串类型的

鸭子类型

python中你看起来像鸭子,那么你就是鸭子

就是相互独立的两个类,本身是没有什么关系的,然后它们内部有共同的名字func,这种就是鸭子

格式

class A:

    def login(self):
pass def register(self):
pass class B: def login(self):
pass def register(self):
pass
# A,B两个类,没有任何关系,独立两个,但是里面的功能相似,所以python一般会将类似于A,B两个类
# 里面的相似的功能让其命名相同.
# 1. A,B虽然无关系,但是很默契的制定了一个规范.让你使用起来更方便.

super

格式

class A:
def f1(self):
print('in A f1') def f2(self):
print('in A f2') class Foo(A):
def f1(self):
# super().f2()
super(Foo, self).f2()
print('in A Foo') obj = Foo()
obj.f1()
# 执行结果
in A f2
in A Foo class A:
def f1(self):
print('in A') class Foo(A):
def f1(self):
super(Foo,self).f1()
print('in Foo') # 2 class Bar(A):
def f1(self):
print('in Bar') # 1 class Info(Foo,Bar): def f1(self):
super(Info,self).f1()
print('in Info f1') # 3 obj = Info()
print(Info.mro()) # [Info, Foo, Bar, A]
obj.f1()
# 执行结果
[<class '__main__.Info'>, <class '__main__.Foo'>, <class '__main__.Bar'>, <class '__main__.A'>, <class 'object'>]
in Bar
in Foo
in Info f1

super() 严格意义并不是执行父类的方法.

单继承: super() 肯定是执行父类的方法.

多继承: super(S,self) 严格按照self从属于的类的mro的执行顺序,执行 S类的下一位.***

类的约束

# 版本二 统一接口
class Wecht: def pay(self,money):
print(f'利用微信支付了{money}') class Alipay: def pay(self, money):
print(f'利用支付宝支付了{money}') def pay(obj, money): # 定义一个统一化的设计
obj.pay(money) obj1 = Wecht()
obj2 = Alipay() pay(obj1,200)
pay(obj2,300) # 输出结果
利用微信支付了200
利用支付宝支付了300 # 版本三 野路子写法 # 版本四 按照之前的代码逻辑进行改变 发现问题:
以上代码没有约束,原因就是想怎么写就怎么写,都能实现当时的功能(个人理解)
在上面的情况下(在一些重要的逻辑,与用户数据相关等核心部分),我们要建立一种约束,避免发生此类错误

类的约束有两种解决方式

  1. 在父类建立一种约束
  2. 利用抽象类(指定的一种规范)的概念

第一种解决方式(建议使用方式)

在父类定义一个pay方法,主动抛出异常,如果子类没有定义pay方法,并且

再建立一个父类pay的方法,约定俗称定义一种规范,子类要定义pay方法,但是没有强制性,还是可以执行
raise 主动报错提醒
class Payment:
def pay(self,money):
raise Exception('必须得定义这个类') class Wechat(Payment): def pay(self,money):
print(f'利用微信支付了{money}') class Alipay(Payment): def pay(self, money):
print(f'利用支付宝支付了{money}') class QQpay(Payment): def fuqian(self, money):
print(f'利用QQ支付了{money}') def pay(obj, money):
obj.pay(money) obj1 = Wechat()
obj2 = Alipay() pay(obj1,200)
pay(obj2,300) obj3 = QQpay()
pay(obj3,599) # 输出结果
Traceback (most recent call last):
File "/Users/wuqiang/work/PycharmProjects/python23/day24/day24.py", line 50, in <module>
pay(obj3,599)
File "/Users/wuqiang/work/PycharmProjects/python23/day24/day24.py", line 41, in pay
obj.pay(money)
File "/Users/wuqiang/work/PycharmProjects/python23/day24/day24.py", line 22, in pay
raise Exception('必须得定义这个类')
Exception: 必须得定义这个类

第二种解决方式

利用抽象类概念, 基类如先设置,子类如果没有定义pay方法,在实例化对象的时候就会抛出错误

from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass class Wecht(Payment): def pay(self,money):
print(f'利用微信支付了{money}') class Alipay(Payment): def pay(self, money):
print(f'利用支付宝支付了{money}') class QQpay(Payment): def fuqian(self, money):
print(f'利用QQ支付了{money}') obj3 = QQpay()
# 输出结果
obj3 = QQpay()
TypeError: Can't instantiate abstract class QQpay with abstract methods pay

python之面向对象性封装,多态,以及鸭子类型的更多相关文章

  1. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  2. python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super

    https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...

  3. 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型

    Python是一种多态语言,其表现特征是:对象方法的调用方只管方法是否可调用,不管对象是什么类型,从而屏蔽不同类型对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化. 一.    P ...

  4. PythonI/O进阶学习笔记_3.1面向对象编程_python的多态和鸭子类型

    前言: 与第一篇的面向对象内容不同的是,第一篇中的面向对象更多的是与类.对象结合起来的概念粗浅理解,就是在编程历史中诞生的一种思想方法. 这篇的面向对象编程,更多落实到在语言设计实现中,是如何体现面向 ...

  5. 多态 与 鸭子类型 duck duck duck

    # --> ''' 多态 与 鸭子类型 --> 什么是多态 对象的多种状态,父类对象的多种 (子类对象) 状态 --> 什么是鸭子类型: 长的像就是 1.规定有什么属性及什么方法的对 ...

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

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

  7. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  8. python多态和鸭子类型

    多态与多态性 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:文件分为文本文件,可执行文件(在定义角度) 比如 我们按下 F1 键这个动作: 如果当前在 Fl ...

  9. Python多态、鸭子类型

    一.多态 多态指的是一类事物有多种形态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.ab ...

随机推荐

  1. 在 React Native 中使用 moment.js 無法載入語系檔案

    moment.js 是很常見的日期時間 library,友善的 API 與極佳的執行效率是它的兩大賣點.例如 (new Date()).getFullYear(),如果使用 moment.js 我可以 ...

  2. 安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)

    针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具. SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件.因此所以,就算用户兴奋起来,狂按按钮播放全部音频, ...

  3. 恭喜你,Get到一份 正则表达式 食用指南

    先赞后看,养成习惯 前言 正则表达式 正则表达式: 定义一个搜索模式的字符串. 正则表达式可以用于搜索.编辑和操作文本. 正则对文本的分析或修改过程为:首先正则表达式应用的是文本字符串(text/st ...

  4. Java后端完整学习路线及资源记录

    Java后端完整学习路线及资源记录 Java语法基础 书籍教程: 视频教程: IDEA的使用 视频教程:JAVA开发利器-IntelliJ IDEA使用教程 Servlet和Web基础 书籍教程: 视 ...

  5. 使用Taiko + Gauge进行自动化测试(一)

    目录 初识Taiko 环境安装 尝试Taiko taiko 执行过程 结合Gauge编写用例 使用Gauge 总结 初识Taiko 先来了解一下什么是Taiko:"Taiko是一个免费的开源 ...

  6. 一些常用的 CSS 技巧和知识点

    作为一名前端工程师,CSS 是必备技能之一,然而在日常开发中,总有那么些时候,面对着炫酷的效果图,脑子里的 CSS 属性却一片空白,于是只能借助搜索引擎,在一堆复杂的介绍中找到需要的内容复制粘贴.有没 ...

  7. 一篇文章彻底说清JS的深拷贝/浅拷贝

    一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者. 第二类,希望扎实JS基础,将来好去面试官前秀操作的好学者. 写给第一类读者 你只需要一 ...

  8. 微服务架构-Gradle下载安装配置教程

    一.开发条件 JDK8下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html Eclipse下载地址:http ...

  9. 304 Not Modified

    304 Not Modified,不是服务器发出的错误,是服务器所承载的业务系统在开发时为了节省带宽和提升浏览器的体验,对GET/js,css,image等执行了缓存机制.客户端第一次对服务器发出GE ...

  10. 【PG】Greenplum-db-6.2.1的安装部署

    目录 1配置host文件(所有节点) 2 配置用户 3 配置/etc/sysctl.conf文件 4 limit文件,后面添加[不影响安装] 5 安装greenplum-db-6.2.1-rhel7- ...