zoukankan      html  css  js  c++  java
  • python面向对象的内置函数和反射

    内置函数                                                       

    1.property

    property装饰的方法不能再传参数

    基本作用:把方一个属性法伪装成一个属性。

    class A:
      @property        #property装饰器
      def func(self):pass    
    • setter

        作用:对@property方法实现赋值操作,有且只能有一个参数new

    class A:
        def __init__(self,name):
            self.__name = name
        @property
        def name(self):
            return self.__name
        @name.setter             #负责对property方法进行修改
        def name(self,new):
            self.__name = new
    • deleter

        作用:对@property方法实现删除操作

    class A:
        def __init__(self,name):
            self.__name = name
        @property
        def name(self):
            return self.__name
        @name.setter
        def name(self,new):
            self.__name = new
        @name.deleter                  #让property方法具备删除的操作
        def name(self): 
            del self.__name

     

    2.classmethod

      作用:在类中定义一个类方法,是一个装饰器。

      什么时候用?

      如果你整个方法中没有用到对象空间中的变量,而用到了类空间中的变量或方法(普通方法或者property方法)

      类方法的默认参数:类名

      类方法的调用方式:类名调用

      在类调用时还是一个方法

     

    3.staticmethod

      将普通方法放到类中,就是在方法前加上staticmethod装饰器。

      这个函数就不需要默认传参

      静态方法的调用方式:类名调用

      在任何情况下staticmethod都是一个函数

    4.isinstance

      作用:判断对象和类的关系

    class A:
        pass
    class B(A):
        pass
    a = A()
    b = B()
    
    print(type(a) is A)              #True
    print(type(b) is A)              #Flase
    
    print(isinstance(a,A))         #True
    print(isinstance(b,A))         #True,b是子类实例化的对象,所以和A也有继承关系
    print(isinstance(a,B))         #Flase  
    

      

    5.issubclass

      作用:判断子类和父类之间的关系

    class A:
        pass
    class B(A):
        pass
    print(issubclass(A,B))           #False
    print(issubclass(B,A))           #True,B是A的子类
    

      

     

    反射                                                             

    what:使用字符串数据类型的变量名来获取这个变量的值

    why and where

    • input,用户输入的全部都是字符串
    • 文件操作,文件写入读出都是字符串
    • 网络,传输都是先转成字符串才能进行其他操作

    how:

    • getattr

        1.反射类中的变量

          getattr(变量名:类空间,字符串:命名空间的变量名)  

          通过getattr反射类中的方法,要通过手动加括号执行。

          推荐反射静态属性,静态方法,类方法

          如果在类中反射不到变量名,会报错,可以通过传入默认参数,不报错,但是通常情况下需要联合hasattr一起用

        2.反射对象中的变量

          格式:getattr(变量名:对象空间,字符串:命名空间的变量名)

          推荐通过对象反射对象属性和类中的普通方法

        3.反射模块中的变量

          格式:getattr(变量名:模块名,字符串:命名空间的变量名)

          多用于自定义模块

        4.反射本文件中的变量

          找到自己的命名空间:

          import sys

          本文件的命名空间:

          sys.modules[__name__]

          所以反射这么用:getattr(sys.modules[__name__],字符串形式的‘变量名’)

    • hasattr

        作用:判断空间内是否存在这个变量,返回True和False

        格式:hasattr(空间名,需要判断的反射的变量名)

        与getattr是伴生关系。

    • setattr

        作用:向某一个空间中创建一个变量

        格式:setattr(空间名,反射的变量名,变量值)

    • delattr

        作用:通过反射删除空间中的变量

        格式:delattr((空间名,需要删除的反射的变量名)

    内置方法                                                        

      定义:在不需要程序员定义,本身就存在类中的方法就是内置方法

      格式:内置方法通常是这样的__名字__

      触发机制:所有的双下方法都不需要我们直接调用,都有另一种自动触发的语法

    • __str__

        触发机制:当你打印对象名时触发,打印__str__返回值;当你打印%s时也会触发,在str强转数据类型时

    • __repr__

        触发机制:是__str__的备胎,当没有__str__的时候执行__repr__

        特殊机制:执行repr内置函数和格式化输出%r时,对应的结果是__repr__的返回值。

    • 特殊情况

        在子类继承父类的时,且子类与父类中都有__str__与__repr__内置方法

    class Foo:
        def __str__(self):
            return 'Foo str'
        def __repr__(self):
            return 'Foo repr'
    class Son(Foo):
        def __str__(self):
            return 'Son str'
        def __repr__(self):
            return 'Son repr'
    son = Son()
    print(son)

        执行的顺序是怎么样的?

        首先son对象执行Son类中的__str__,随后执行父类Foo中的__str__,再返回执行Son类中的__repr__最后执行父类中的__repr__

  • 相关阅读:
    C#连接、访问MySQL数据库
    对列表遍历同时增删操作时注意事项 c
    Linux 操作命令 c
    Memcached 入门 转载与ferreousbox
    转载http://zxiaofei168.iteye.com/blog/1044843 spring事务管理
    spring mvc 学习 转载
    自定义Annotation
    Java的路径问题 转载
    设置火狐调试时间
    vi/vim 基本使用方法(转载)
  • 原文地址:https://www.cnblogs.com/abner28/p/9568125.html
Copyright © 2011-2022 走看看