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

day21接口类和抽象类,隔离原则,开放封闭原则,多态

python学习8_1 面向对象(继承多态封装)以及零散概念(组合,property,绑定方法与非绑定方法,反射,内置函数)

Python 面向对象

18-面向对象之基础