Python基础之魔法方法总结(五)

180 阅读2分钟

1. 基本魔法方法

  • _new_(cls[,…])
    对象实例化时调用的第一个方法,第一个参数是这个类,其余参数传递给__init__
  • _init_(self[,…])
    构造器,实例被创建时调用的初始化方法
  • _del_(self)
    析构器,实例被销毁时调用的方法
  • _call_(self[,args…])
    允许一个类的实例像函数一样被调用:x(a,b)调用x._call_(a,b)
  • _class_
    获得已知实例的类别时:对象a._class_(),得到的其实就是这个类A,进而可以访问A的属性
  • _bases_
    获取指定类的所有父类构成元素,使用方法为:类名A._bases_
  • _len_(self)
    定义当被len()调用时的行为
  • _repr_(self)
    定义当被repr()调用时的行为
  • _str_(self)
    定义当被str()调用时的行为,print(a)时默认调用
  • _all_
    _all_=['函数名或方法名']的方式限制一下哪些函数或方法可以被导入,__all__魔法方法只针对通过 from xx import *这种导入方式有效
  • _bytes_(self)
    定义当被bytes()调用时的行为,直接输出a时默认调用
  • _hash_(self)
    定义当被hash()调用时的行为
  • _bool_(self)
    定义当被bool()调用时的行为
  • _format_(self)
    定义当被format()调用时的行为

2. 有关属性

  • _getattr_(self,name)
    定义当用户试图获取一个不存在的属性时的行为
def__setattr__(self, name, value):
    self.name = value
    # 每一次属性赋值时, __setattr__都会被调用,因此不断调用自身导致无限递归了。
#因此正确的写法应该是:
def__setattr__(self, name, value):
    self.__dict__[name] = value
#__delattr__如果在其实现中出现del self.name 这样的代码也会出现"无限递归"错误,这是一样的原因。
  • _getattribute_(self,name)
    定义当该类的属性被访问时的行为
  • _setattr_(self,name,value)
    定义当一个属性被设置时的行为
  • _delattr_(self,name)
    定义当一个属性被删除时的行为
  • _dir_(self)
    定义当dir()被调用时的行为
  • _get_, _set_, _delete_: 一个类要成为描述器,必须实现这三个中至少一个方法

3. 自定义容器

  • ** _len_(self)、_getitem_(self,key)**:定义不可变容器
  • _len_(self)、_getitem_(self,key)、_setitem_(self,key,value)、_delitem_(self,key):定义可变容器