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__

猜你喜欢

转载自www.cnblogs.com/abner28/p/9568125.html