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
时间: 2024-12-31 00:28:05

Python基础day-21[面向对象:多态,绑定方法]的相关文章

Python面向对象编程 绑定方法

类的函数属性绑定给不同对象,是不同的绑定方法.对象调用绑定方法时会把对象本身当做self参数传入 示例代码 class People: country = 'China' ? def __init__(self, name, sex, age): self.Name = name self.Sex = sex self.Age = age ? def test(self): print(self) ? ? conan = People('Conan', 'male', 8) wukong = P

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

面向对象,绑定方法与异常处理(七)

1.1 继承与派生 1.1.1 什么是继承     是一种新建类的方式,新建的类称为子类,子类会遗传父类的属性,可以减少代码冗余     在python中,子类(派生类)可以继承一个或者多个父类(基类,超类)   python中类的继承分为:单继承和多继承 class Parent1: #定义父类 pass class Parent2(object): #定义父类 pass class Sub1(Parent1): ##单继承,基类是Parent1,派生类是Sub1 pass class Sub

三 面向对象之绑定方法与非绑定方法

一 绑定方法 二 非绑定方法 三 classmethod和staticmethod的区别 一 绑定方法 绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法.                 为类量身定制                 类.boud_method(),自动将类当作第一个参数传入               (其实对象也可调用,但仍将类当作第一个参数传入) 2. 绑定到对象的方法:没有被任何装饰器装饰的方

多态 ,绑定方法

1\ 多态 一种事物,有多种形态,都可以调用同一种方法. 以列表,字符串,元组为例,都有长度,都可以调用 len() 函数, import abcclass Animal(metaclass=abc.ABCMeta): #同一类事物:动物 Animal 就是对多态性的表现 @abc.abstractmethod def talk(self): pass class People(Animal): #动物的形态之一:人 def talk(self): print('say hello')class

python24 面向对象的绑定方法 类与类之间的继承

## 类属性与对象属性 类中应该仅存储所有对象共有的内容 ? 如所有人的国籍相同那就放到类中 对象中存储每个对象独有的内容 ? 如每个人的名字都不同 ## __init__方法的作用 init 是初始化的缩写 用于为对象的属性设置初始值 特点: ```# 执行时机:当实例化产生对象时会自动执行该函数# 会自动传入需要初始化的对象# 初始化必须包含至少一个参数 用于表示对象本身# 该函数不允许有返回值 必须为None``` ## 绑定方法 绑定即两个东西绑在一起 方法就是函数 那就是说绑定方法 =

【2020Python修炼记】面向对象编程——绑定方法与非绑定方法

[目录] 一.绑定方法与非绑定方法 二.非绑定方法 一.绑定方法与非绑定方法 ? 类中定义的函数分为两大类:绑定方法和非绑定方法 ? 其中绑定方法又分为绑定到对象的对象方法和绑定到类的类方法. ? 在类中正常定义的函数默认是绑定到对象的,而为某个函数加上装饰器@classmethod后,该函数就绑定到类了. 类方法通常用来在__init__的基础上提供额外的初始化实例的方式: # 配置文件settings.py的内容 HOST='127.0.0.1' PORT=3306 # 类方法的应用 imp

面向对象之绑定方法与非绑定方法(day7)

一.类中定义的函数分成两大类 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1)绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 类.boud_method(),自动将类当作第一个参数传入(其实对象也可调用,但仍将类当作第一个参数传入) 2)绑定到对象的方法:没有被任何装饰器装饰的方法. 为对象量身定制 对象.boud_method(),自动将对象当作第一个参数传入(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说) 2.非

面向对象之绑定方法与非绑定方法

#切记:绑定方法:绑定给谁就应该由谁来调用,谁来调用就会把谁当做第一个参数自动传入 class MySQL: def __init__(self,host,port): self.host=host self.port=port def func(self): print('%s 说:你好啊我的天' %self.name) @classmethod #不依赖self.属性 传入时使用 def from_conf(cls): return cls(settings.HOST,settings.PO