• 类和对象的方法


    一、绑定方法和非绑定方法

    类中定义的函数分为两大类:绑定方法和非绑定方法

    • 绑定方法:分为绑定到类和对象的方法,绑定给谁,就应该由谁来调用,谁来调用就回把调用者当作第一个参数自动传入

      • 绑定到对象的方法:在类内定义的没有被任何装饰器修饰的

      • 绑定到类的方法:在类内定义的被装饰器classmethod修饰的方法

    • 非绑定方法没有自动传值这么一说了,就类中定义的一个普通工具,对象和类都可以使用

      • 非绑定方法:为类中某个函数加上装饰器@staticmethod,不与类或者对象绑定
      class Foo:
          def __init__(self, name):
              self.name = name
      
          def tell(self):
              print('名字是%s' % self.name)
      
          @classmethod
          def func(cls):  # cls=Foo
              print(cls)
      
          @staticmethod
          def func1(x, y):
              print(x + y)
      
      
      # 实例对象调用对象的绑定方法
      f = Foo('tester')  # 名字是tester
      f.tell()  # 3
      # 实例对象调用静态方法(非绑定方法)
      f.func1(1, 2)
      # 实例的对象调用类方法
      f.func()  # <class '__main__.Foo'>
      
      # 类调用类方法(绑定方法)
      Foo.func()  # <class '__main__.Foo'>
      # 类调用静态方法
      Foo.func1(2, 3)  # 5
      

    二、类里面的装饰器

    • @staticmethod ,把类里面的函数设置为静态方法,即为非绑定发放

    • @classmethod,被装饰的方法设置为类方法,类方法的第一个参数指向类对象自己

    • @property,把方法当成属性一样去使用

      class People:
          def __init__(self, name):
              self.__name = name
      
          @property
          def name(self):
              # print('getter')
              return self.__name
      
          @name.setter
          def name(self, val):
              # print('setter',val)
              if not isinstance(val, str):
                  print('名字必须是字符串类型')
                  return
              self.__name = val
      
          @name.deleter
          def name(self):
              print('deleter')
              print('不允许删除')
      
      
      p = People('tester')
      p.name = 'aa'
      print(p.name)  # aa
      del p.name
      

    三 、反射

    python是动态语言,而反射(reflection)机制被视为动态语言的关键。反射机制指的是在程序的运行状态中

    • 对于任意一个类,都可以知道这个类的所有属性和方法;

    • 对于任意一个对象,都能够调用他的任意方法和属性。

    这种动态获取程序信息以及动态调用对象的功能称为反射机制。

    反射的核心本质就是以字符串的形式去导入一个模块,利用字符串的形式去执行函数。

    反射:通过字符串映射到对象的属性、方法、模块

    反射的应用

    class Service:
        def run(self):
            while True:
                inp = input('>>: ').strip()  # cmd='get a.txt'
                cmds = inp.split()  # cmds=['get','a.txt']
    
                # print(cmds)
                if hasattr(self, cmds[0]):
                    func = getattr(self, cmds[0])
                    func(cmds)
    
        def get(self, cmds):
            print('get.......', cmds)
    
        def put(self, cmds):
            print('put.......', cmds)
    
    
    obj = Service()
    obj.run()
    

    hasattr(object,name)

    判断object中有没有一个name字符串对应的方法或属性
    

    getattr(object, name, default=None)

    def getattr(object, name, default=None): # known special case of getattr
        """
        getattr(object, name[, default]) -> value
    
        Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
        When a default argument is given, it is returned when the attribute doesn't
        exist; without it, an exception is raised in that case.
        """
        pass
    

    setattr(x, y, v)

    def setattr(x, y, v): # real signature unknown; restored from __doc__
        """
        Sets the named attribute on the given object to the specified value.
    
        setattr(x, 'y', v) is equivalent to ``x.y = v''
        """
        pass
    

    delattr(x, y)

    def delattr(x, y): # real signature unknown; restored from __doc__
        """
        Deletes the named attribute from the given object.
    
        delattr(x, 'y') is equivalent to ``del x.y''
        """
        pass
    
  • 相关阅读:
    IT项目中使用 json格式数据 保存项目配置信息, 在配置文件再读取json文件的内容进行赋值
    python 使用eval() 可以将json格式的数据,转换为原始数据
    python 取出字典的键或者值/如何删除一个字典的键值对/如何遍历字典
    python2 中 unicode 和 str 之间的转换及与python3 str 的区别
    python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法
    Django 项目拆分配置文件settings.py
    苹果笔记本调整 pycharm 字体大小的地方
    django rest framework 向数据库中插入数据时处理外键的方法
    java实现文件的压缩和解压
    java 跨数据库导入大数据
  • 原文地址:https://www.cnblogs.com/snailrunning/p/14358755.html
Copyright © 2020-2023  润新知