一 多态和多态性
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')
文件有多种形态:文本文件,可执行文件
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')
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
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
综上我们也可以说,多态性是‘一个接口(函数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 '''
二 绑定方法和非绑定方法
类中定义的函数分为了两大类:
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 #
绑定给对象的方法:没有被任何装饰器给装饰,为对象专门定制的。
对象名.函数名(),而对象会被自动当中第一个参数给传入。
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> #查看结果为普通函数