Python中的魔术方法

1.__str__,__repr__方法

使用print()打印时触发

 

__str__的优先级更高:

  __str__和__repr__都存在时只会触发__str__

 

2.__del__方法

在对象被删除时触发

对象未被引用时会自动触发

 

3.isinstance()和issubclass()

isinstance(obj, cls) 检查obj是否是类cls的对象

 

class Foo(object):
    pass
 
obj = Foo()
 
isinstance(obj, Foo)
>>> True

 

issubclass(sub, super) 检查sub类是否是super的派生类

 

class Foo(object):
     pass
  
 class Bar(Foo):
     pass
  
 issubclass(Bar, Foo)
>>> True

 

4.__doc__方法

能够识别类内注释文字

class Foo:
    '我是描述信息'
    pass

print(Foo.__doc__)
>>> 我是描述信息

# 无法继承给子类

 

5.__enter__,__exit__方法

上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法

 

先执行__enter__再执行with()语句最后执行__exit__

 

__exit__(self, exc_typeexc_valexc_tb)

__exit__()中的三个参数分别代表异常类型异常值追溯信息,with语句中代码块出现异常,则with后的代码都无法执行

 如果__exit()返回值为True,那么异常会被清空,就好像啥都没发生一样,with后的语句正常执行

 

6.__setattr__,__delattr__,__getattr__

__setattr__添加/修改属性会触发它的执行

__delattr__删除属性的时候会触发

__getattr__只有在使用点调用属性且属性不存在的时候才会触发

 

7.__setitem__,__delitem__,__getitem__

同上,但是调用方式不同

 

setattr  ====> 调用方式: f.xxx

setitem  ====> 调用方式: f['xxx']

 

8.__call__方法

对象后面加括号,触发执行

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

obj = Foo()  # 执行__init__

obj()  # 执行__call__

 

9.__new__方法

在类准备将自身实例化时调用。

posted @ 2023-10-10 21:25  wellplayed  阅读(17)  评论(0)    收藏  举报