• 多态 ,绑定方法


    1 多态

    一种事物,有多种形态,都可以调用同一种方法.

    以列表,字符串,元组为例,都有长度,都可以调用 len() 函数,

    import abc
    class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 Animal 就是对多态性的表现
    @abc.abstractmethod
    def talk(self):
    pass

    class People(Animal): #动物的形态之一:人
    def talk(self):
    print('say hello')
    class Pig(Animal): #动物的形态之二:猪
    def talk(self):
    print('heng')
    class Dog(Animal): #动物的形态之三:狗
    def talk(self):
    print('wang')
    alex=People()
    yuan=Pig()
    wu=Dog()
    # alex.talk()
    # yuan.talk()
    # wu.talk()
    def talk(obj):
    #obj 就是多态性的表现,obj可以是人,,,,是对有同一类事物的描述
    obj.talk()
    talk(alex) #Alex是通过父类继承出People子类里实例化出来的
    talk(wu) #wu是通过父类继承出pig子类里实例化出来的
    talk(yuan) #yuan是通过父类继承出Dog子类里实例化出来的
    #三个对象是来自不同的子类,但都有来自父类的函数名调用了不同的功能

    一个抽象类可以有多个子类,子类 之间都有相同属性,多态都依赖继承概念

    #===========文件的多态
    import abc
    class File(metaclass=abc.ABCMeta)#同一类事物,文件
        @abc.abstractmethod
        def click(self):
            pass
        
    class Text(File):  #文件的形态之一,文本文件
        def click(self):
            print('open file')
    class Exfile(File):  #文件的形态之二.可执行文件
        def click(self):
            print('execute file')

    不同的对象都用了一样的函数名,产生了不同的行为(方法)

    一个 接口  (函数) ,多种功能实现

    继承于一个父类产生的不同对象,用同一个函数名实现 不同的功能,多态

    3绑定方法

    类中定义的函数分成两大类:

      一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):

        1. 绑定到类的方法:用classmethod装饰器装饰的方法。

                    为类量身定制

                    类.boud_method(),自动将类当作第一个参数传入

                  (其实对象也可调用,但仍将类当作第一个参数传入)

        2. 绑定到对象的方法:没有被任何装饰器装饰的方法。

                   为对象量身定制

                   对象.boud_method(),自动将对象当作第一个参数传入

                 (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)

     1 class MySQL:
     2     def __init__(self,ip,port):
     3         self.ip=ip
     4         self.port=port
     5     @classmethod
     6     def from_conf(cls):
     7         import settings  #从文件里读取
     8         obj=cls(settings.ip,settings.port) #obj=MySQL('1.1.1.1',8080)
     9         obj.x=111111111111111111111111111111111
    10         return obj
    11 
    12 m=MySQL('127.0.0.1',8080)
    13 # print(m.ip,m.port)
    14 
    15 obj=MySQL.from_conf()
    16 #
    17 print(obj.ip)
    18 print(obj.port)
    19 print(obj.x)

     二:非绑定方法:用staticmethod装饰器装饰的方法

         1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已

        注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说

     1 #非绑定方法
     2 import hashlib
     3 import time
     4 import pickle
     5 class People:
     6     def __init__(self,name,sex,user_id):
     7         self.name=name
     8         self.sex=sex
     9         self.user_id=user_id
    10         self.id = self.create_id()
    11     def bar(self):
    12         print('--->',self.name)
    13 
    14     def create_id(self):
    15         m=hashlib.md5()
    16         m.update(self.name.encode('utf-8'))
    17         m.update(self.sex.encode('utf-8'))
    18         m.update(str(self.user_id).encode('utf-8'))
    19         return m.hexdigest()
    20 
    21     def save(self):
    22         with open(self.id,'wb') as f:
    23             pickle.dump(self,f)
    24 
    25 
    26 f1=People('egon1','male',123123123123123)
    27 # f2=People('egon2','female',123123123123123)
    28 # f3=People('egon3','male',123123123123123)
    29 
    30 # print(f.create_id())
    31 print(f1.id)
    32 # print(f2.id)
    33 # print(f3.id)
    34 #
    35 f1
  • 相关阅读:
    prometheus 基于文件的目标发现
    prometheus rules
    consul kv使用介绍
    prometheus 标签使用
    prometheus 配置容器 cadvisor监控节点
    prometheus 配置介绍
    Ubuntu 13.10 录音有特别大噪音解决办法
    Ubuntu 13.10 解决虚拟机摄像头无法使用问题
    Ubuntu 13.10 安装软件失败后出现的问题——已安装 post-installation 脚本 返回了错误号 1
    Ubuntu 13.04 VirtualBox在工作区中的切换
  • 原文地址:https://www.cnblogs.com/gyh04541/p/7128424.html
Copyright © 2020-2023  润新知