zoukankan      html  css  js  c++  java
  • 类和对象的方法

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

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

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

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

      • 绑定到类的方法:在类内定义的被装饰器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
    
  • 相关阅读:
    Oracle spatial、openlayers、geoserver开发地理信息系统总结
    解决Geoserver请求跨域的几种思路,第二种思路用过
    OpenLayers中的球面墨卡托投影
    墨卡托投影、地理坐标系、地面分辨率、地图比例尺
    jQuery Easing 动画效果扩展
    jQuery实现鼠标移上弹出提示框,移出消失
    验证码生成组件--JCaptcha的使用
    jquery validate 验证
    Oracle查询错误分析:ORA-01791:不是SELECTed表达式
    启动tomcat报host-manager does not exist or is not a readable directory异常
  • 原文地址:https://www.cnblogs.com/snailrunning/p/14358755.html
Copyright © 2011-2022 走看看