zoukankan      html  css  js  c++  java
  • python多态和一些内置方法

    python多态和一些内置方法

    什么是多态:

    多态指的是同一种类型的事物,不同的形态

    多态的目的:

    “多态”也称之为“多态性”,目的是为了在不知道对象具体类型的情况下,同一对象调用方法的规范(比如:名字)

     

    多态的“表现形式之一”就是继承:

    先抽象,在继承

     

    父类:定制一套统一的规范。(比如:方法的统一)

    子类:遵循父类的统一规范。 (比如:子类遵循父类方法名的统一)

    注意:在python中不会强制限制子类, 必须要遵循父类的规范,所以出现了抽象类。



    # 动物类
    class Animal:
       def eat(self):
           pass

       def speak(self):
           pass

    class Pig(Animal):
       def eat(self):
           print('吧唧 吧唧...')


    class Cat(Animal):
       def eat(self):
           print('喵喵喵...')

    class Dag(Animal):
       def eat(self):
           print('汪汪汪...')

    a1 = Pig()
    a2 = Cat()
    a3 = Dag()

    a1.eat()
    a2.eat()
    a3.eat()

    抽象类

    什么是抽象类?

    在python内置中的abc模块中,有一个抽象类。

    抽象类的作用:

    让子类必须遵循父类的编写规范

    如何实现抽象类

    父类需要继承abc模块中metaclass = abc.ABCMeta

    在父类的方法中,需要装饰上 abc.abseractmethod

     

    注意: 在python中不推荐使用抽象类

     

    自己不虚按照父类的方法编写规范,缺一不可。

    (只要父类中有几个抽象方法,子类就必须要定义几个)

    import abc


    # 父类
    class Animal(metaclass=abc.ABCMeta):
       @abc.abstractmethod
       def eat(self):
           pass

       @abc.abstractmethod
       def speak(self):
           pass


    class Pig(Animal):
       def eat(self):
           print('biajibiaji ')

       def speak(self):
           print('哼哼哼')

    a1 = Pig()

    a1.eat()
    a1.speak()

    鸭子类型

    什么是鸭子类型:

    不同的对象,只要长得像鸭子, 动作行为像鸭子,那它就是鸭子

    鸭子是多态的一种表现形式

    为什么要有鸭子类型: 不同对象,先抽象出相同的类型的方法, 给他们制定一套统一的规范,

    所有的类,在定义是都按照统一的规范进行书写

    多态的三种表现形式

    1、继承父类 ***

    2、继承抽象类 ***

    3、鸭子类型 **** 耦合度低, 程序可扩展性高

     

    注意:在python中,强烈推荐使用鸭子类型

     

    lass Pig:
       def eat(self):
           print('bia唧...')

       def speak(self):
           print('哼哼哼...')


    # 猫类
    class Cat:
       def eat(self):
           print('咬ji 咬ji....')

       def speak(self):
           print('喵喵喵...')


    # 狗类
    class Dog:
       def eat(self):
           print('舔 ji 舔ji...')

       def speak(self):
           print('汪汪汪...')


    dog = Dog()
    pig = Pig()
    cat = Cat()

    # dog.speak()
    # pig.speak()
    # cat.speak()


    # 多态之炫技
    def SPEAK(animal):
       animal.speak()
       
       
    # SPEAK(dog)
    # SPEAK(pig)
    # SPEAK(cat)

    classnethod和staticmethod

    classnethod和staticmethod都是python解释器的内置装饰器(重要)

    classmethod:

    是一个装饰器,给在类内部定义方法中装饰。 将类内部的方法变为“类的绑定方法”

    staticmethod:

    翻译:静态方法

    是一个装饰器,在给类内部定义方法中装饰,将类内部的方法变为“非法绑定方法”

    对象的绑定方法:

    由对象来调用,由谁来调用,会将谁(对象)当做第一个参数传入

    类的绑定方法: 由类来调用,由谁来调用,会将谁(类)当做第一个参数传入

    非绑定方法:

    可以由对象或类来调用,谁来调用都是一个普通方法(普通函数), 方法需要传入几个参数,就要传入几个

    class DB:
       __data = 'haowuliaoa'
       def __init__(self, user, pwd, role):
           self.user = user
           self.pwd = pwd
           self.role = role

       # 查看数据
       @classmethod
       def check_db(cls, user, pwd, role):
           obj = cls(user, pwd, role)


           # 查看数据前,必须要通过校验
           if obj.user == 'jinyi' and obj.pwd == '123' and obj.role == 'admin':
               print('检验通过')
               print(cls.__data)
               return cls.__data
           else:
               print('验证不通过')

    DB.check_db('jinyi', '123', 'admin')



    class Foo:
       @staticmethod
       def func(res):
           print(res)

    obj = Foo()

    # 对象调用非绑定方法
    obj.func(123)

    # 类调用非绑定方法
    Foo.func(123)

    isinstance与issubclass

    isinstance与issubclass是python的内置模块

    isinstance: 判断一个对象是否是另一个对象的实例

    如果是:True

    如果不是:False

    issubclass: 判断一个类是否是另一个类的子类

    如果是:Ture

    如果不是:False

    class Feacher:
       pass

    class Sub(Feacher):
       pass


    class Foo:
       pass


    print(issubclass(Foo, Feacher))
    print(issubclass(Sub, Feacher))

    反射

    反射指的是通过“字符串”对对象的属性进行操作


    hasattr:通过“字符串”判断对象的属性或方法是否存在

    getattr:通过“字符串”获取对象的属性或方法

    setattr:通过“字符串”设置对象的属性或方法

    delattr:通过“字符串”删除对象的属性或方法

     

    注意:反射的四个方法是python中内置的

    class Foo:
       def __init__(self, x, y):
           self.x = x
           self.y = y

    obj = Foo(10, 20)

    # hasattr: 通过 “字符串” 判断对象的属性或方法是否存在。
    # 判断
    print(hasattr(obj, 'x'))

    # getattr: 通过 “字符串” 获取对象的属性或方法。
    # 查
    print(getattr(obj, 'y'))
    res = getattr(obj, 'q', '不存在')
    print(res)

    # setattr: 通过 “字符串” 设置对象的属性或方法。
    # 增 改
    setattr(obj, 'q', 30)
    print(getattr(obj, 'q'))

    # delattr: 通过 “字符串” 删除对象的属性或方法。
    delattr(obj, 'q')
    print(getattr(obj, 'q', '没有了'))

     

     

     

     

  • 相关阅读:
    8.1.1 播放合成声音
    CSS 用伪类 :after 选择器清除浮动
    javascript 拖拽
    javascript 回到顶端
    用 console.time()和 console.timeEnd() 测试你的 javascript 代码执行效率
    【风马一族_代码英语】代码英语之五
    【风马一族_代码英语】代码英语之四
    【风马一族_代码英语】代码英语之三
    【风马一族_Android】第4章Android常用基本控件
    【风马一族_日常灵感】在美国得到的人生感悟
  • 原文地址:https://www.cnblogs.com/zhangjinyi97/p/11952982.html
Copyright © 2011-2022 走看看