zoukankan      html  css  js  c++  java
  • python 多态这一部分的知识点相关应用

    类型这块

    type 一个对象的时候,这个对象的类型,总是这个对象所属的类

    type任何一个类,它的类型都是type,type是所有数据类型和类的鼻祖

    type的类型是它本身 type  = type(type)

    函数的类型就是函数

    python是一种动态语言,一个鸭子类型举例:动态python变量,在赋值的时候,赋值号(=)右边的数据类(list,set,float等)对象是什么类型,他就是什么类型

    a. 常规创造的类 总是有几个特性:

      能够实例化

      能有属性

      能有方法

    b.元类能够帮助你创造不同寻常的类(下面就来了)

      不能实例化

      只能有一个实例

    类 =type(该类对象)

    type = type(类) 

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

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

    元类的应用(归一化设计)

    归一化设计

      a.方便用户记忆

      b.方便用户使用

    python 的归一化设计用的是一下的东西:

    from abc import ABCMeta,abstractmethod
    class Father(metaclass= ABCMeta):     #抽象类,如果你用了这种,
        def __init__(self,name,price):    #在@abstractmethod方法下面函数,在此类的每一个
            self.name = name              #子函数必须实现该函数,但是在此类此函数可以写一些
            self.price = price            #简单代码,抽象类也不能实例化
        @abstractmethod
        def pay(self):
            pass
    class Wechatpay(Father):
        def pay(self):
            print(f'{self.name}付了{self.price}')
    class Alipay(Father):
        def pay(self):
            print(f'{self.name}付了{self.price}')
    def pay(person):                #归一化设计  就是将zy.pay() = pay(zy)
        return person.pay()         #方便用户记忆
                                    #方便用户使用
    zy = Wechatpay('zy',1000)
    hfl = Alipay('hfl',2000)
    pay(zy)
    pay(hfl)
    from abc import ABCMeta,abstractmethod
    class A(metaclass=ABCMeta):
        @classmethod
        @abstractmethod
        def func(cls):
            print('in func')
    class B(A):
        def __init__(self,name):
            self.name = name
        def func(self):
            print('ss')
    A.func()
    c = B('alex')
    print(c.name)
    ^在此类此函数可以写一些简单代码,这么做就ok了,将这个抽象方法定义成类方法,在外部用类名调用

    多变化的抽象类继承

    
    
    from abc import ABCMeta,abstractmethod
    class Normalanimals(metaclass=ABCMeta):
    @abstractmethod
    def eat(self):
    pass
    @abstractmethod
    def drink(self):
    pass

    class
    Flyanimals(metaclass=ABCMeta): @abstractmethod def fly(self): pass class Swimanimals(metaclass=ABCMeta): @abstractmethod def swim(self): pass class Tiger(Normalanimals,Swimanimals): def eat(self):pass def drink(self):pass def swim(self):pass class swam(Normalanimals,Swimanimals,Flyanimals): def eat(self):pass def drink(self):pass def swim(self):pass def fly(self):pass

    鸭子类型:
    python当中写程序的一种特殊的情况
    其他语言中 正常的我们说一个数据类型具有某个特点,通常是通过继承来实现
    继承迭代器类,来证明自己本身是个迭代器
    继承可哈希的类,来证明自己本身是可哈希的
    但是所有的这些都不是通过继承来完成的
    我们只是通过一种潜规则的约定,如果具有__iter__,__next__就是迭代器
    如果具有__hash__方法就是可哈希的
    如果具有__len__就是可以计算长度的
    这样的数据类型之间的关系并不仅仅是通过继承来约束的
    而是通过约定俗成的关系来确认的
    list.index()
    str.index()
    鸭子类型是一种约定俗称的关系,只在python里有
    多态:
    在传递参数的时候,如果要传递的参数有可能是多个类的对象
    我们又必须在于严重清楚的描述出到底是哪一个类型的对象
    我们就可以使用继承的形式,有一个父类作为这些所有可能被传递进来的对象的基类
    基础类型就可以写成这个父类了
    于是所有子类的对象都是属于这个父类的
    在python当中,因为要传递的对象的类型在定义阶段不需要明确,所以我们在python中处处是多态
    数据类型不需要通过继承来维护统一

    命名元组

    创建一个不可以更改属性,没有自带方法的类

    调用的时候用 from collections import nametuple

    对比:通过这个对比,我们知道这个类只能做调用单个参数值,连呈现内容都做不到,看来跟常量性质一样了
    
    from collections import namedtuple
    
    Course = namedtuple('Course',['name','ad','hp'])
    python = Course('python',100,120)
    print(python.name)          #只能这样做
    # print(python.__dict__)   不可行 ,连特么的呈现内容都呈现不出来,看来跟常量的性质一样
    
    class A:
        def __init__(self,name,ad,hp):
            self.name = name
            self.ad = ad
            self.hp = hp
    c = A('zy',12,34)
    print(c.__dict__)

    还有一种命名元组你想到了么?

    嘿嘿,那就是time时间模块里的 struct_time

    它是通过 time.localtime 获取,它的也是一个struct_time类,但是它的属性更nametuple一样不可更改,也不可以添加

    也没有自己的方法

    >>> time.localtime()
    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=22, tm_min=9, tm_sec=1, tm_wday=1, tm_yday=189, tm_isdst=0)
    >>> time.localtime()[1]
    7
    >>> time.localtime().tm_mon
    7

    pickle的意义

        import pickle    
        class A(object):
            def __init__(self,name,hp,ad)
                self.name = name
                self.hp = hp
                self.ad = ad
        person = A('zy',100,10)
        with open('t1','wb') as f1:
            pickle.dump(person,f1)
        with open('t1','rb')as f2:
            c = pickle.load(f2)
        print(c.__dict__)

     

    总结:
    多态的实现在其他语言中用继承来实现,比如Java用接口实现多继承
    在python当中是通过鸭子类型来实现,弱类型语言的意思就是不同类型的变量不允许相加
    python还是一种动态语言,一个鸭子类型举例 动态python变量,在赋值的时候,赋值号(=)右边的数据类(list,set,int,float等)对象是什么类型 它就是什么类型

  • 相关阅读:
    python中写一个求阶乘的函数
    python中filter关键字
    python中写一个求阶乘的函数
    python中如何获取函数文档
    python中lambda关键字创建匿名函数
    固态硬盘中m.2、sata、nvme、ahci、pcie是什么?
    python中lambda关键字定义匿名函数
    python中实现实参可选
    python中map()内置函数
    python中将实参变成可选的
  • 原文地址:https://www.cnblogs.com/CNHK1949/p/10617038.html
Copyright © 2011-2022 走看看