023_接口类,抽象类,多态,鸭子类型,封装

1,接口类

 1 class Wechat():
 2     def pay(self,money):
 3         print(‘已经用微信支付了%s元‘%money)
 4 class Alipay():
 5     def pay(self,money):
 6         print(‘已经用支付宝支付了%s元‘ % money)
 7 wechat = Wechat()
 8 ali = Alipay()
 9 # wechat.pay(100)
10 # ali.pay(200)
11 #将上面两句用下面的替换,
12 def pay(pay_obj,money):  # 统一支付入口
13     pay_obj.pay(money)
14 pay(wechat,100)
15 psy(ali,200)

2
2.1,问题
如果来个人接手这个程序,他要添加一个应用支付。但他并不知道你的其它应用支付方法你定义的都是pay方法(程序如上例),且统一支付接口调用pay方法。
他自己添加的应用支付的支付方法并不是用pay命名的。因此,当用统一接口支付时,找不到对应的支付方法,就会报错。

例如在上程序添加如下代码
class Applepay():
    def zhifu(self,money):
        print(‘已经用applepay支付了%s元‘ % money)

app = Applepay()
pay(app,100) #报错

2.2,解决上问题,
定义一个父类,并将上面的支付程序都继承这个父类,当用统一接口调用时,如该应用的支付没有该方法,就会执行父类的这个pay方法,抛出异常给接受该程序的人看,告诉他,没有实现这个方法。
class Payment:
    def pay(self,money):
 raise NotImplemented   #抛出没有实现这个方法的异常

2.3,解决方法升级,规范化程序
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):  # 元类 默认的元类 type #metaclass不是继承,而是指定元类
    @abstractmethod
    def pay(self,money):pass    # 没有实现这个方法

通过上面的代码,写一个规范程序的父类。将各支付类都继承该父类。起到规范子类程序的作用。
这样接手的人在实例化对象时,就会报错,并提示少了什么方法。
app = Applepay()  #报错

2.4,
# python中规范化程序称为 :接口类或者抽象类都可以
#在Java中有严格区分:
# 接口类 支持多继承,接口类中的所有的方法都必须不能实现 —— java
# 抽象类 不支持多继承,抽象类中方法可以有一些代码的实现 —— java

3,多态
    python没有多态,因为python天生支持多态
    多态指的是一类事物有多种形态,动物有多种形态:人,狗,猪
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class People(Animal): #动物的形态之一:人
    def talk(self):
        print(‘say hello‘)

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print(‘say wangwang‘)

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print(‘say aoao‘)

4,鸭子类型
逗比时刻:
  Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象
也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法
例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系

#二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
class TxtFile:
    def read(self):
        pass

def write(self):
        pass

class DiskFile:
    def read(self):
        pass
    def write(self):
        pass

5,封装
# 广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
# 只让自己的对象能调用自己类中的方法

# 狭义上的封装 —— 面向对象的三大特性之一
# 属性 和 方法都藏起来 不让你看见

# 所有的私有 都是在变量的左边加上双下划綫
    # 对象的私有属性
    # 类中的私有方法
    # 类中的静态私有属性
# 所有的私有的 都不能在类的外部使用
class Person:
    __key = 123  # 私有静态属性
    def __init__(self,name,passwd):
        self.name = name
        self.__passwd = passwd   # 在变量的左边加上双下划线,就变成私有属性

def __get_pwd(self):         # 私有方法
        return self.__passwd   #只要在类的内部使用私有属性,就会自动的带上“_类名”,在外部这样定义不会。

def login(self):          # 正常的方法调用私有的方法,即在只在内部使用
        self.__get_pwd()

alex = Person(‘alex‘,‘alex3714‘)
print(alex._Person__passwd)   # “_类名或对象名__属性名”可以调出该属性,但是不要用此方法在外部操作。
print(alex.get_pwd())

原文地址:https://www.cnblogs.com/eternity-twinkle/p/10605583.html

时间: 2025-01-08 20:45:35

023_接口类,抽象类,多态,鸭子类型,封装的相关文章

python开发面向对象基础:接口类&抽象类&多态&多继承

一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 开发中容易出现的问题 1 class Alipay: 2 ''' 3 支付宝支付 4 ''' 5 def pay(self,money): 6 print('支付宝支付了%s元'%money) 7 8 class Applepay: 9 ''' 1

Python_015(面向对象(接口类,抽象类,多态,封装)

一.抽象类与接口类 1.抽象类:抽象即类似或者说比较像的部分,继承描述的是父类与子类的一种关系,要找出这种关系,必须先抽象再继承; a:抽象分成两个层次: 1)由对象->类:将两个有相似地方的对象抽取成类; 2)由类->父类:将两个有相似地方的类抽取成父类; :抽象最主要的作用就是划分类别(可以隔离关注点,降低复杂度) 2.为什么要有抽象类 与Java一样,Python也有抽象类的概念,需要借助模块实现,它是一个特殊的类,特殊之处在于只能被继承,不能被实例化; 类是从一些对象中抽取相同的内容而

组合||抽象类||多态||鸭子类型

组合 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 class People: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex class Renwen(People): def __init__(self,name,age,sex,weapon): super().__init__(name,age,se

python 2018.7.25 接口类,抽象类

python 没有接口这个概念 接口类,抽象类: 制定一个规范. from abc import ABCMeta,abstractmethodclass Payment(metaclass=ABCMeta): # 抽象类(接口类): @abstractmethod def pay(self): pass # 制定了一个规范 class Alipay(Payment): def __init__(self,money): self.money = money def pay(self): prin

接口类抽象类

接口类(抽象类): 在python中是没有接口类,可以把接口类和抽象类视为同一种定义:制定一个规范举例:收到项目经理的要求,写一个支付: #第一版 class Alipay: def __init__(self,money): self.money = money def pay(self): print('zfb支付了%s' % self.money) class Jd: def __init__(self, money): self.money = money def pay(self):

16 Apr 18 封装的property 多态 鸭子类型 classmethod和staticmethod

16 Apr 18 一.      封装的property BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解) 成人的BMI数值: 过轻:低于18.5 正常:18.5-23.9 过重:24-27 肥胖:28-32 非常肥胖, 高于32 体质指数(BMI)=体重(kg)÷身高^2(m) 首先需要明确.bmi是算出来的,不是一个固定死的值,也就说我们必须编写一个功能,每次调用该功能都会立即计算一个值,但很明显人的bmi值听起来更像一个名词而非

php中普通类 接口类 抽象类 浅谈

一.普通类 1.关键词:class  类名,继承关键字extends 2.继承:只能实现单继承, 3.多态:子类继承可以实现多种功能 4.封装:类有权限机制,私有的只能自己用,受保护的可以被继承,子类的权限必须大于等于父类 5.实例化:可以被实例化 二.接口类 1.关键词 :interface  类名   ,继承关键字 implements 2.继承:可以实现多继承,父类有的方法属性,子类必须有,类可以实现多个接口,用逗号来分隔多个接口的名称 3.多态:同样具有多态性 4.封装:所有的方法,属性

python 接口类、抽象类、多态

参考https://www.cnblogs.com/Fantac/p/11481114.html 接口类和抽象类总结 在python中没有接口类,但有抽象类;abc模块中的metaclass = ABCMeta,@abstractmethod它的本质是做代码的规范用的,希望子类中能实现父类名字完全一样的方法 接口类和抽象类: 从java的角度上看是有区别的,java本来就支持单继承所以就有了抽象类;java没有多继承,所以为了接口隔离原则,设计了接口这个概念,支持多继承了 而python它既支持

接口与抽象类 、多态

接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 接口主要是java等语言中的概念,python中并没有明确的限定 from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): @abstractmethod def