Python基础day-21[面向对象:多态,绑定方法]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础day-21[面向对象:多态,绑定方法]相关的知识,希望对你有一定的参考价值。
多态:
指的是一种事物的多种形态。
例如:
数据类型有多种形态:字符串,列表,元组
动物的多种形态:狗,猫,老虎,狮子...
一个抽象类有多个子类,因而多态的概念依赖于继承。
import abc class A(metaclass=abc.ABCMeta): @abc.abstractmethod def talk(self): #子类必须有 talk方法 pass class B(A): def talk(self): print(‘say Hi‘) class C(A): def talk(self): print(‘say CCCC‘) e = B() #实例化对象 d = C() def talk(obj): #定义一个函数,传入对象 #obj就是多态性的具体表现形式 obj.talk() #调用对象的方法 talk(e) talk(d) 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-21/day21_练习.py say Hi say CCCC Process finished with exit code 0
上述代码:可以这么理解,打个比方A指的动物类,下面B和C分别代表狗和猫,狗和猫都会叫但是,叫的声音都不同,这就是多态。
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同功能的函数。
绑定的方法:
绑定方法有两种:
绑定到对象的方法:
定义:凡是在类中定义的函数(没有被任何装饰器修饰),都是绑定给对象的。
使用者:对象
特点:obj.bar()自动把obj当做第一个参数传入。
绑定到类的方法:
定义:在类中定义的,被classmethod装饰的函数就是绑定到类的方法。
使用者:类
特点:类.class_method()自动把类当做第一个参数传入。
示例:
class People: def __init__(self,name): self.name = name def bar(self): print(‘--->‘,self.name) @classmethod def func(cls): f = cls(‘ldsly‘,18,‘nan‘) #实例化 print(cls) #查看cls是什么 print(f.name,f.age,f.sex) #打印对象属性 class User(People): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex User.func() #User类调用People类的func方法 <---绑定到类的方法 p1 = People(‘ldsly_p1‘) #实例化 p1.bar() #对象调用方法 <----绑定到对象的方法 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-21/day21_练习.py <class ‘__main__.User‘> ldsly 18 nan ---> ldsly_p1 Process finished with exit code 0
还有种非绑定方法:
不依赖类的参数运行,类和对象都能调用的函数。不跟任何对象或者类绑定。非绑定方法本质就是一个函数,就是一个工具而已。
import pickle class Student: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex @staticmethod #使用 staticmethod 来设置非绑定方法 def load_info(): #这个非绑定函数仅仅是反序列化文件,并打印相应的信息 with open(‘student.pkl‘, ‘rb‘) as f: res = f.read() ldsly = pickle.loads(res) print(ldsly.name, ldsly.age, ldsly.sex) ldsly = Student(‘ldsly‘,23,‘male‘) with open(‘student.pkl‘,‘wb‘) as f: #序列化保存 对象ldsly res = pickle.dumps(ldsly) f.write(res) print(Student.load_info) #类去调用 print(ldsly.load_info) #对象去调用 Student.load_info() #执行,执行时没有任何值传入 ldsly.load_info() 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-19/序列化.py <function Student.load_info at 0x03476198> #发现对象和类看到的是同一个,并且是一个普通的函数 <function Student.load_info at 0x03476198> ldsly 23 male #执行结果,相同 ldsly 23 male Process finished with exit code 0
以上是关于Python基础day-21[面向对象:多态,绑定方法]的主要内容,如果未能解决你的问题,请参考以下文章
回归python培训——类与对象继承多态和多态性封装绑定方法和非绑定方法反射
python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)多态封装的特性property
python学习8_1 面向对象(继承多态封装)以及零散概念(组合,property,绑定方法与非绑定方法,反射,内置函数)