面向对象(魔术方法、反射、异常、minins)

发布时间 2023-06-29 20:54:49作者: 菜CAIx

魔术方法(内置方法)

1.__str__ 、__repr__

当调用类产生对象,如果直接打印对象或输出对象的时候,如果类里有方法__str__或__repr__时,不再打印对象的内存地址,而会运行一遍方法里的代码,然后打印出方法的返回值,返回值只能是字符串。

当两个方法都存在时__str__的优先级更高

class Aa:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        print('str')
        return 'aaa'

a = Aa('a')
print(a)  # str   aaa

 

2.__del__

在类里面如果有__del__,当整个程序结束的时候,会执方法里的代码,或者将产生的对象删除的时候会自动触发

可以做一些清楚垃圾的操作

 

3.isinstance和issubclass

1.isinstance(a,b)

  查看对象a是不是类b调用所得的结果,返回布尔值

2.issubclass(a,b)

  查看类b是不是类a 的父类,也就是类a有没有继承类b

 

4.__doc__

可以查看类的内部的详细信息,就是可以查看类的备注,但是只能看当前类的,类所继承的父类并不显示

class Bb:
    '''
    bbb
    '''
    pass

class Aa(Bb):
    '''
    aaa
    '''
    pass

print(Aa.__doc__)  # aaa

 

5.__enter__和__exit__

联合with一起使用,当出现with 类  as  f时,会将__enter__方法执行,并返回值赋予给as后面的变量,如果没有就不返回;当with下的代码块执行结束时,会运行__exit__方法 

当with语句中出现异常的时候__exit__如果有形参(exc_type,exc_val,exc_tb)会自动将异常传入

exc_type:异常类型

exc_val:异常值

exc_tb:追溯异常

 

6.__setattr__、__delattr__、__getattr__

当产生对象的类里面有这三个方法__setattr__、__delattr__、__getattr__,

对象使用点(  . )语法属性时  

会触发这三个办法,分别是赋值、删除、取值

 

7.__setitem__、__delitem__、__getitem__

和上一个组合类似,不过现在不是点(  .  )语法,而是括号( [ ] )语法

 

8.__call__

当产生对象的类里有__call__方法时,对象()会执行__call__里面的代码,

如果__call__有返回值者 对象()=返回值

 

反射

反射就是用字符串型式操作

1.getattr

获取,也可以使用方法

class Bb:
    age = 1

    def aa(self):
        print('aa')
        return 222


res = Bb()
res1 = getattr(Bb, 'age')  # 1 
print(res1)
print(getattr(res, 'aa')())  # 内存地址然后执行
# aaa    222

 

2.setattr

修改值,原理和用法于getattr类似,但是括号里需要填3个元素,不然会报错

setattrr(stu, ' x ',222)   # 对象或类、操作的字符串、所修改的值​​

如果没有x 这个属性或方法,则添加

 

3.delattr

删除属性,原理和用法同getattr类似,不过现在是删除

 

4.hasattr

判断属性或方法在不在类或对象里面,使用和原理同getattr类似

他会返回布尔值

 

5.用反射来导入模块

res = __import__('datetime')  # 导入模块
res2 = getattr(res, 'datetime')
print(res2.now())  # 2023-06-29 20:24:58.922506

 

异常补充

这里的异常不是使用try,而是主动抛出异常,主动去创造异常

当代码遇见

raise  xxxxError( ' xxxxxx ')

raise  Exception(' xxxxx ')      #  raise为关键字,后面的错误类型,括号里面是报错信息