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等)对象是什么类型 它就是什么类型

  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/CNHK1949/p/10617038.html
Copyright © 2011-2022 走看看