zoukankan      html  css  js  c++  java
  • 面向对象之多态和绑定方法

    一 多态和多态性

    1 什么是多态:多态就是一种失误的多种形态。(例如:水有冰的形态,还有水蒸气的形态等等)一个抽象类有多个子类,因而多态的概念依赖于继承。

    序列类型有多种形态:字符串,列表,元组。

    动物有多种形态:人,狗,猪

     1 import abc
     2 class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
     3     @abc.abstractmethod
     4     def talk(self):
     5         pass
     6 
     7 class People(Animal): #动物的形态之一:人
     8     def talk(self):
     9         print('say hello')
    10 
    11 class Dog(Animal): #动物的形态之二:狗
    12     def talk(self):
    13         print('say wangwang')
    14 
    15 class Pig(Animal): #动物的形态之三:猪
    16     def talk(self):
    17         print('say aoao')
    View Code

    文件有多种形态:文本文件,可执行文件

     1 import abc
     2 class File(metaclass=abc.ABCMeta): #同一类事物:文件
     3     @abc.abstractmethod
     4     def click(self):
     5         pass
     6 
     7 class Text(File): #文件的形态之一:文本文件
     8     def click(self):
     9         print('open file')
    10 
    11 class ExeFile(File): #文件的形态之二:可执行文件
    12     def click(self):
    13         print('execute file')
    View Code

    2 什么是多态性

    多态性是指具有不同函数的功能可以使用同一个函数名,也就是同一个函数名可以调用不同功能的函数。面向对象中是怎么表示多态性的:给不同的对象发送同一条信息,而不同对象在接收到信息后不同的行为或方法。也就是说每一个对象用自己的方式去响应共同的调用函数。不同的行为是指不同的实现,即不同的函数。

    比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同

    多态性分为静态多态性和动态多态性

    静态多态性:如任何类型都可以用运算符+进行运算

    动态多态性:如下1

            2

     1 >>> def func(animal): #参数animal就是对态性的体现
     2 ...     animal.talk()
     3 ... 
     4 >>> people1=People() #产生一个人的对象
     5 >>> pig1=Pig() #产生一个猪的对象
     6 >>> dog1=Dog() #产生一个狗的对象
     7 >>> func(people1) 
     8 say hello
     9 >>> func(pig1)
    10 say aoao
    11 >>> func(dog1)
    12 say wangwang
    View Code

          3

    1 >>> def func(f):
    2 ...     f.click()
    3 ... 
    4 >>> t1=Text()
    5 >>> e1=ExeFile()
    6 >>> func(t1)
    7 open file
    8 >>> func(e1)
    9 execute file
    View Code

     综上我们也可以说,多态性是‘一个接口(函数func),多种实现(如f.click())’

    3为什么要用多态性(多态性的好处)

    python本身就是支持多态性的

    多态性的好处:1.增加了程序的灵活性:不管对象怎么变化,使用者都可以用同一种形式去调用它

                            2增加了程序额可扩展性:通过继承类创建了一个新的类,使用者无需更改自己的代码,还是用函数名(类名)去调用 

     1 >>> class Cat(Animal): #属于动物的另外一种形态:猫
     2 ...     def talk(self):
     3 ...         print('say miao')
     4 ... 
     5 >>> def func(animal): #对于使用者来说,自己的代码根本无需改动
     6 ...     animal.talk()
     7 ... 
     8 >>> cat1=Cat() #实例出一只猫
     9 >>> func(cat1) #甚至连调用方式也无需改变,就能调用猫的talk功能
    10 say miao
    11 
    12 '''
    13 这样我们新增了一个形态Cat,由Cat类产生的实例cat1,使用者可以在完全不需要修改自己代码的情况下。使用和人、狗、猪一样的方式调用cat1的talk方法,即func(cat1)
    14 '''
    View Code

    二 绑定方法和非绑定方法

    类中定义的函数分为了两大类:

        1 绑定方法:绑定给谁,谁来调用就会自动的将它本身当作第一个参数被传入。

                  绑定到类的方法:classmethod装饰器是专门给类定制的

        类.函数名():类名会被自动当作第一个参数被传入。而对象调用时,也是将类名当作第一个参数被传入。

                属于类的函数,类可以调用,但是没有自动传值。

        classmehtod

     1 # class People:
     2 #     def __init__(self,name):
     3 #         self.nam=name
     4 #     def bar(self):
     5 #         print(self.name)
     6 #     @classmethod
     7 #     def func(cls):
     8 #         print(cls)
     9 # t=print('egon')
    10 # print(t.bar)
    11 # People.func()
    12 #
    View Code

    绑定给对象的方法:没有被任何装饰器给装饰,为对象专门定制的。

                对象名.函数名(),而对象会被自动当中第一个参数给传入。

        2 非绑定方法:用staticmethod装饰器来装饰的。

               不与类或对象绑定,但是他们都可以调用。但是没有传值,只是一个普通的工具。

              注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说

       

    statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果,python为我们内置了函数staticmethod来把类中的函数定义成静态方法

     1 import hashlib
     2 import time
     3 class MySQL:
     4     def __init__(self,host,port):
     5         self.id=self.create_id()
     6         self.host=host
     7         self.port=port
     8     @staticmethod
     9     def create_id(): #就是一个普通工具
    10         m=hashlib.md5(str(time.clock()).encode('utf-8'))
    11         return m.hexdigest()
    12 
    13 
    14 print(MySQL.create_id) #<function MySQL.create_id at 0x0000000001E6B9D8> #查看结果为普通函数
    15 conn=MySQL('127.0.0.1',3306)
    16 print(conn.create_id) #<function MySQL.create_id at 0x00000000026FB9D8> #查看结果为普通函数
    View Code
  • 相关阅读:
    动态表格
    Palindrome Number
    String to Integer (atoi) ???
    Reverse Integer
    Two Sum
    Path Sum
    Minimum Depth of Binary Tree
    Plus One
    Maximum Depth of Binary Tree
    Symmetric Tree
  • 原文地址:https://www.cnblogs.com/fangjie0410/p/7127389.html
Copyright © 2011-2022 走看看