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', '没有了'))

     

     

     

     

  • 相关阅读:
    WSP部署错误—SharePoint管理框架中的对象“SPSolutionLanguagePack Name=0”依赖其他不存在的对象
    Elevate Permissions To Modify User Profile
    Error with Stsadm CommandObject reference not set to an instance of an object
    ASP.NET MVC3添加Controller时没有Scaffolding options
    测试使用Windows Live Writer写日志
    配置TFS 2010出现错误—SQL Server 登录的安全标识符(SID)与某个指定的域或工作组帐户冲突
    使用ADO.NET DbContext Generator出现错误—Unable to locate file
    CSS
    HTML DIV标签
    数据库
  • 原文地址:https://www.cnblogs.com/zhangjinyi97/p/11952982.html
Copyright © 2011-2022 走看看