面向对象之:封装,多态,以及类的约束

1.封装

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

顾名思义就是将内容封装到某个地方,以后再去调用被封装的内容

封装的步骤

  • 将内容封装到某处

    class A:
        def __init__(self,name):
            self.name=name
            self.age=age
    obj1=A(‘张三‘,18)
    #将张三和18封装到name和age属性中
  • 从某处调用封装的内容

    直接调用

    class A:
        def __init__(self,name):
            self.name=name
            self.age=age
    obj1=A(‘张三‘,18)
    print(obj1.name)

    间接调用

    class A:
        def __init__(self,name):
            self.name=name
            self.age=age
        def get(self):
            print(self.name)
    obj1=A(‘张三‘,18)
    obj1.get()

    总结,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。

2.多态

多态,同一个对象,多种形态。python默认支持多态。

3.鸭子类型

python中有一句谚语说的好,你看起来像鸭子,那么你就是鸭子。对于代码上的解释其实很简答:
class A:
    def f1(self):
        print(‘in A f1‘)

    def f2(self):
        print(‘in A f2‘)
?
?
class B:
    def f1(self):
        print(‘in A f1‘)

    def f2(self):
        print(‘in A f2‘)

obj = A()
obj.f1()
obj.f2()
?
obj2 = B()
obj2.f1()
obj2.f2()
A 和 B两个类完全没有耦合性,但是在某种意义上他们却统一了一个标准。对相同的功能设定了相同的名字,这样方便开发,这两个方法就可以互成为鸭子类型。这样的例子比比皆是:str  tuple list 都有 index方法,这就是统一了规范。str bytes 等等 这就是互称为鸭子类型。

4.类的约束

版本一:
# class Wechat_Pay:
#
#     def pay(self,money):
#         print(f‘微信支付了{money}元‘)
#
#
# class Ali_Pay:
#
#     def pay(self, money):
#         print(f‘阿里支付了{money}元‘)
#
# wp = Wechat_Pay()
# ap = Ali_Pay()
#
# wp.pay(100)
# ap.pay(200)
版本二 统一化接口?
# class Wechat_Pay:
#
#     def pay(self,money):
#         print(f‘微信支付了{money}元‘)
#
#
# class Ali_Pay:
#
#     def pay(self, money):
#         print(f‘阿里支付了{money}元‘)
#
#
# def pay(obj, money):  # 归一化设计,统一接口
#     # wp.pay(100)
#     obj.pay(money)
#
# wp = Wechat_Pay()
# ap = Ali_Pay()
#
# pay(wp,100)
# pay(ap,200)
?
版本三: 来了一个野生程序员,增加qq支付功能。
# class Wechat_Pay:
#
#     def pay(self,money):
#         print(f‘微信支付了{money}元‘)
#
#
# class Ali_Pay:
#
#     def pay(self, money):
#         print(f‘阿里支付了{money}元‘)
#
#
# class QQ_Pay:
#
#     def zhifu(self,money):
#         print(f‘qq支付了{money}元‘)
#
#
# def pay(obj, money):  # 归一化设计,统一接口
#     # wp.pay(100)
#     obj.pay(money)
?
# wp = Wechat_Pay()
# ap = Ali_Pay()
#
# pay(wp,100)
# pay(ap,200)
# qp = QQ_Pay()
# qp.zhifu(300)
?对某些类里面的重要的方法强行加一些约束,规范化。最简单的约束:
# class Payment:
#
#     def pay(self,money):
#         pass
#
#
# class Wechat_Pay(Payment):
#
#     def pay(self,money):
#         print(f‘微信支付了{money}元‘)
#
#
# class Ali_Pay(Payment):
#
#     def pay(self, money):
#         print(f‘阿里支付了{money}元‘)
#
#
# class QQ_Pay(Payment):
#
#     def zhifu(self,money):
#         print(f‘qq支付了{money}元‘)
#
#
# def pay(obj, money):  # 归一化设计,统一接口
#     # wp.pay(100)
#     obj.pay(money)
制定约束的方式一:在父类定义必须要创建的方法,然后让此方法主动抛出异常。
?
# class Payment:
#
#     def pay(self, money):
#         raise Exception(‘子类必须定义此方法‘)
#
# class Wechat_Pay(Payment):
#
#     def pay(self, money):
#         print(f‘微信支付了{money}元‘)
#
#
# class Ali_Pay(Payment):
#
#     def pay(self, money):
#         print(f‘阿里支付了{money}元‘)
#
#
# class QQ_Pay(Payment):
#
#     def zhifu(self, money):
#         print(f‘qq支付了{money}元‘)
#
#
# def pay(obj, money):  # 归一化设计,统一接口
#     # wp.pay(100)
#     obj.pay(money)
#
# qp = QQ_Pay()
# pay(qp,400)
?方式二:借助于抽象(接口)类,利用元类metclass去实现完全约束。
from abc import ABCMeta, abstractmethod
?
class Payment(metaclass=ABCMeta):  # 抽象类,接口类 制定一个强硬的规范约束。
    @abstractmethod
    def pay(self, money):
        pass
?
class Wechat_Pay(Payment):
?
    def pay(self, money):
        print(f‘微信支付了{money}元‘)
?
class Ali_Pay(Payment):
?
    def pay(self, money):
        print(f‘阿里支付了{money}元‘)
?
?
class QQ_Pay(Payment):
?
    def zhifu(self, money):
        print(f‘qq支付了{money}元‘)
?
?
def pay(obj, money):  # 归一化设计,统一接口
    # wp.pay(100)
    obj.pay(money)
?
qp = QQ_Pay()

规范化约束方式一

在父类定义必须要创建的方法,然后让此方法主动抛出异常。

制定约束的方式一:
?
# class Payment:
#
#     def pay(self, money):
#         raise Exception(‘子类必须定义此方法‘)
#
# class Wechat_Pay(Payment):
#
#     def pay(self, money):
#         print(f‘微信支付了{money}元‘)
#
#
# class Ali_Pay(Payment):
#
#     def pay(self, money):
#         print(f‘阿里支付了{money}元‘)
#
#
# class QQ_Pay(Payment):
#
#     def zhifu(self, money):
#         print(f‘qq支付了{money}元‘)
#
#
# def pay(obj, money):  # 归一化设计,统一接口
#     # wp.pay(100)
#     obj.pay(money)
#
# qp = QQ_Pay()
# pay(qp,400)

方式二

借助于抽象(接口)类,利用元类metclass去实现完全约束。

from abc import ABCMeta, abstractmethod
?
class Payment(metaclass=ABCMeta):  # 抽象类,接口类 制定一个强硬的规范约束。
    @abstractmethod
    def pay(self, money):
        pass
?
class Wechat_Pay(Payment):
?
    def pay(self, money):
        print(f‘微信支付了{money}元‘)
?
class Ali_Pay(Payment):
?
    def pay(self, money):
        print(f‘阿里支付了{money}元‘)
?
class QQ_Pay(Payment):
?
    def zhifu(self, money):
        print(f‘qq支付了{money}元‘)
?
def pay(obj, money):  # 归一化设计,统一接口
    # wp.pay(100)
    obj.pay(money)
?
qp = QQ_Pay()

总结,约束. 其实就是?类对?类进?约束. ?类必须要写xxx?法. 在python中约束的?式和?法有两种:

  • 使?抽象类和抽象?法, 由于该?案来源是java和c#. 所以使?频率还是很少的
  • 使??为抛出异常的?案. 并且尽量抛出的是NotImplementError. 这样比较专业, ?且错误比较明确.(推荐)

原文地址:https://www.cnblogs.com/z-x-h/p/12088434.html

时间: 2024-10-03 23:11:21

面向对象之:封装,多态,以及类的约束的相关文章

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: ? ? ? ? ? ?将一些东西封装到一个地方,你还可以取出来 ? ? ? ? ? ?类设置静态属性, 设置一些方法 或者 对象, 对象可以在其对象封装一些属性 多态: ? ? ? ? ? ?python默认支持多态, 多态指的是一种事务具有多种形态 ? ? ? ? ? ?1.多态可以增加代码的灵活度: ? ? ? ? ? ?2.以继承和重写父类方法为前提: ?

面向对象基础----封装数据库操作类

思考:现在掌握了很多面向对象相关的内容,但是什么时候封装类?怎么封装?如果使用类成员? 引入:其实类的封装没有多么复杂,但是需要一个熟练的过程来确定哪些东西可以放到类里,该用什么样的形式等.我们通过封装一个数据库的操作来综合练习下 封装数据库类 掌握 定义:封装数据库操作类,即根据数据库的操作需求,来确认数据库操作类该有什么样的功能,以及这些功能该如何实现. 1.一个类通常就是一个文件,所以要先确定文件的名字:通常类文件命名规范有两种. 文件名字与类名一样,如Sql.php 为了区分普通php文

面向对象之:封装,多态

python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到一个对象中. 把固定功能的代码封装到一个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了一个很牛B的函数. 那这个也可以被称为封装. 在面向对象思想中. 是把一些看似无关紧要的内容组合到一起统一进行存储和使用. 这就是封装. 2. 继承: 子类可以自动拥有父类中除了私有属性外的其他所有内容. 说白了, 儿子可以随便用爹的东西. 但是朋友们, 一定要认清楚一个事情.

oldboy 21th day. I love Python. 面向对象之封装, 多态, 继承 三大特性

一, 主要内容: 接口类:( 只是在工作中, 书写的一种规范.) 抽象类: 用处: 在工作中, 如果你要是规定几个类, 必须有一样的方法, 你要是抽象类. 封装: 1, 将一些属性或者方法 (一些有用的信息) 放置在一个空间中. 2, 私有成员的封装:私有静态变量, 私有属性, 私有方法 特点: 在变量前+__双下划线, 并且在类外面,子类访问私有变量,私有方法 是访问不到的. 因为私有成员,在运行时, 都会变成: _类名__变量名 所以你在类的外部,或者派生类中都不可访问. 有些方法, 变量,

面向对象之 封装 继承 多态

#!/usr/bin/env python # _*_ coding:utf-8 _*_ class Role(object): #继承object类 ac = None #脚本一执行跟着类一起存到了内存 类变量 #类变量和实例变量的区别: #类变量脚本执行跟着类一起存到了内存,不管是否调用都存在,实例变量是存在实例内的, def __init__(self,name,role,weapon): #初始化方法 实例化后自动执行 #self 代表实例本身.谁调用就是谁. name role,wea

封装 多态 类的约束 super

python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到?个对象中. 把固定功能的代码封装到?个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了?个很?B的函数. 那这个也可以被称为封装. 在?向对象思想中. 是把?些看似?关紧要的内容组合到?起统?进?存储和使?. 这就是封装. 2. 继承: ?类可以?动拥有?类中除了私有属性外的其他所有内容. 说?了, ??可以随便?爹的东?. 但是朋友们, ?定要认清楚?个事情.

多继承,封装,多态,super()方法,类的约束

多继承: 多继承就是一个类里有多个父类,父类也可以有多个爷爷类.从多个父类中继承属性跟方法. 类的分类: python2.2之前,只有经典类,pythont2.2之后出现了新式类 经典类:不继承object类,多继承遵循深度优先,从左至右,一条路走到底 class A:pass 新式类:继承object类,多继承遵循c3算法,mro方法. class A(object):pass python3x版本只有新式类. 鸭子类型:两个结构类似,有弱关联关系的函数或者类. mro方法:(面试会考) 计算

封装,多态,继承. super的方法,类的约束,

1.python的三大特性:python的三大特性,封装,多态,继承封装:函数 模块 类 对象多态 : python中默认支持多态继承: python中的子类继承父类属性和方法 鸭子类型: 看着像鸭子,它就是鸭子python中处处都是鸭子 # 两者之间没有任何关系,但是都遵循着一个隐形的标准两个类中的鸭子类型:# 优点:1,统一标准,减少了词汇量# 2,两者之间没有任何耦合性,但是可以产生关系,其中一个的对象可以调用另一个类的方法# 其他例子 :index pop clear 2. super的

2、C#面向对象:封装、继承、多态、String、集合、文件(上)

面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. 打包,便于管理,为了解决大型项目的维护与管理. 三.什么是类? 将相同的属性和相同方法的对象进行封装,抽象出 “类”,用来确定对象具有的属性和方法. 类.对象关系:人是类,张三是人类的对象. 类是抽象的,对象是具体的.对象可以叫做类的实例,类是不站内存的,对象才占内存. 字段是类的状态,方法是类执