zoukankan      html  css  js  c++  java
  • 元类,归一化设计,抽象类

    元类:

      对象是被创造出来的,被类实例化出来的,类也是被创造出来的,是被特殊的方式创造的

      能够创造不同寻常的类。

        1 不能被实例化  

        2 有且只有一个实例

     常规的类特点:

        1 能够被实例化  

        2 具有属性

        3 具有方法

    类= type(对象)

    type = type(类)

      所有的类型,说的都是这个对象是属于哪一个类的

      所有的用class常规语法创造出来的类,都是type类型型

    print(type(Course))
    print(type(int))
    print(type(str))

    归一化设计

      当所有的类中都有一样的方式时,通常使用归一化设计,统一调用

      

    class Wechatpay:
        def __init__(self, name, money):
            self.name = name
            self.money = money
    
        def pay(self):
            print('%s通过微信支付了%s元' % (self.name, self.money))
    
    
    class Alipay:
        def __init__(self, name, money):
            self.name = name
            self.money = money
    
        def pay(self):
            print('%s通过支付宝支付了%s元' % (self.name, self.money))
    
    
    class ApplePay:
        def __init__(self, name, money):
            self.name = name
            self.money = money
    
        def fuqian(self):
            print('%s通过apple pay支付了%s元' % (self.name, self.money))
    
    
    # 归一化设计
    def pay(person):  # 这里就是归一化设计了,上面的类中,都有存在同样的函数方法名,就可以使用归一化设计
        person.pay()
    
    
    wcp = Wechatpay('alex', 2000000)
    pay(wcp)            # 这里 是调用归一化设计的地方,
    ali = Alipay('alex', 2000000)
    
    app = ApplePay('alex', 2000000)
    pay(app)

    抽象类:

      约束子类,规范代码,被abcstractmethod装饰器装饰的函数,在子类中都必须拥有一个名称相同的方法

      

    from abc import ABCMeta,abstractmethod
    class Payment(metaclass = ABCMeta):
        @abstractmethod    # 这里就是装饰器了
        def pay(self):       #这个方法,在这个类的子类中必须存在 
            pass            

    多态:

      在传递参数的时候,如果要传递的对象有可能是多个类的对象

      1 我们又必须在语言中清楚的描述出到第是哪一个类型的独享

      2 我们就可以使用继承的形式,有一个父类作为这些所有可能被传递进来的对象的基类

      3  基础类型就可以写成这个父类

      4 于是所有子类的对象都是属于这个父类的

      在python中,因为要传递的对象的类型在定义阶段不需要明确,所以我们在Python中处处是多态

      数据的类型不需要通过继承来维护统一

    鸭子类型:

      多个相似的类具有相同的方法名

      但是又不通过抽象类或者继承父类约束的

      这几个具有相同方法的类就是鸭子类型

  • 相关阅读:
    [leetCode]404. 左叶子之和
    [leetCode]572. 另一个树的子树
    [leetCode]226. 翻转二叉树
    [leetCode]637. 二叉树的层平均值
    [leetCode]102. 二叉树的层序遍历
    [leetCode]590. N叉树的后序遍历
    [leetCode]589. N叉树的前序遍历
    [leetCode]145. 二叉树的后序遍历
    [leetCode]94. 二叉树的中序遍历
    [leetCode]381. O(1) 时间插入、删除和获取随机元素
  • 原文地址:https://www.cnblogs.com/mk-lovefreedom/p/10642808.html
Copyright © 2011-2022 走看看