一 多态和多态性

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

 

posted on 2017-07-06 17:12  方少0410  阅读(236)  评论(0编辑  收藏  举报