python魔术方法

特殊属性
属性含义
name类、函数、方法等的名字
module类定义所在的模块
class对象或类所属的类
bases类的基类的元组,顺序为它们在基类列表中出现的顺序
doc类、函数的文档字符串,如果没有定义则为None
mro类的mro,class.mro()返回的结果的保存在__mro__中
dict类或实例的属性,可写的字典
查看属性
方法意义
dir返回类或者对象的所有成员名称列表。dir()函数操作实例就是调用__dir__()

如果dir([obj])参数obj包含方法__dir__(),该方法将被调用。如果参数obj不包括__dir__(),该方法将最大限度地收集属性信息。
dir(obj)对于不同类型的对象obj具有不同的行为:

  • 如果对象是模块对象,返回的列表包含模块的属性名和变量名
  • 如果对象是类型或者说是类对象,返回的列表包含类的属性名,及它的祖先类的属性名
  • 如果是类的实例
    • 有__dir__方法,返回可迭代对象的返回值
    • 没有__dir__方法,尽可能收集实例的属性名、类的属性和祖先类的属性名
  • 如果obj不写,返回列表包含内容不同
    • 在模块中,返回模块的属性和变量名
    • 在函数中,返回本地作用域的变量名
    • 在方法中,返回本地作用域的变量名

内建函数:

  • locals()返回当前作用域中的变量字典
  • globals()当前模块全局变量的字典
魔术方法
  • 分类:
    • 创建、初始化与销毁
      • new
      • init__与__del
    • 可视化
    • hash
    • bool
    • 运算符重载
    • 容器和大小
    • 可调用对象
    • 上下文管理
    • 反射
    • 描述器
    • 其他杂项
      实例化
      |方法|意义 |
      |–|--|
      |new |实例化一个对象,该方法需要返回一个值,如果该值不是cls的实例,则不会调用__init__,该方法永远都是静态方法 |
class A:
    def __new__(cls,*args,**kwargs):
        print(cls)
        print(args)
        print(kwargs)
        return None
    def __init__(self,name):
        self.name=name
a=A()
print(a)

在这里插入图片描述
__new__方法很少使用,即使创建了该方法,也会使用return super().new(cls)基类object的__new__方法开创建实例并返回。

可视化
方法意义
strstr()函数、format()函数、print()函数调用,需要返回对象的字符串表达。如果没有定义,就去调用__repr__没有定义,就直接返回对象的内存地址信息
repr内建函数repr()对一个对象获取字符串表达。调用__repr__方法返回字符串表达,如果.__repr__也没有定义,就直接返回object的定义就是显示内存地址信息
bytesbytes() 函数调用,返回一个对象的bytes表达,即返回bytes对象
class A:
    def __init__(self,name,age=18):
        self.name=name
        self.age=age
    def __repr__(self):
       return '{}{}'.format(self.name,self.age)
    def __str__(self):
        return '{}{}'.format(self.name,self.age)
    def __bytes__(self):
        return (self.name,self.age)
a=A('tom')
print(a)
print("{}".format(A('tom')))
print([A('tom')])
print([str(A('tom'))])

hash
方式意义
hash内建函数hash()调用的函数值,返回一个整数。如果定义这个方法该类的实例就可hash
print(hash(1))
print(hash('tom'))
print(hash(('tom',)))

在这里插入图片描述

eq
方法意义
eq对应==操作符,判断2个对象是否相等,返回bool值,定义了这个方法,如果不提供__hash__方法,那么实例将不可hash

__hash__方法只是返回一个hash值作为set的key,但是去重,还需要__eq__来判断2个对象是否相等,hash相等,只是hash冲突,不能说明两个对象是相等的。
因此,一般来说提供__hash__方法是为了作为set或者dict的key,如果去重要同时提供__eq__方法。不可hash对象isinstance(p1,collections.Hashable)一定为False

bool
方法意义
bool内建函数bool(),或者对象放在逻辑表达式的位置,调用这个函数返回布尔值,没有定义__bool__(),就找__len__()返回长度。非0为真。如果__len__()也没有定义,那么所有实例都返回真
class A:pass
print(bool(A()))

在这里插入图片描述

class B:
    def __bool__(self):
        return False
print(bool(B))
print(bool(B()))

在这里插入图片描述

class C:
    def __len__(self):
        return 1
print(bool(C()))

在这里插入图片描述

运算符重载

operater模块提供了以下的特殊方法,可以将类的实例使用下面的操作符来操作

运算符特殊方法含义
<,<=,==,>,>=,!=lt,le,eq,gt,ge,__ne比较运算符
+,-,-=,/,%,//,**,divmodadd,sub,mul,truediv,mod,floordiv,pow,divmod算数运算符名,移位、位运算也有对应的方法
+=,-=,*=,/=,%=,//=,**=iadd,isub,imul,itruediv,imod,ifloordiv,ipow
容器相关方法
方法意义
len内建函数len(),返回对象的长度(>=0的整数) ,如果把对象当做容器类型看,就如同list或者dict. bool()函数调用的时候,如果没有__bool__()方法,则会看__len()方法是否存在,存在返回非0为真
iter迭代容器时,调用,返回一个新的迭代器对象
containsin 成员运算符,没有实现,就调用__iter__方法遍历
getitem实现self[key]访问,序列对象,key接受整数为索引,或者切片,对于set和dict,key为hashable,key不存在引发keyerror一场
setitem和___getitem__的访问类型类似,是设置值得方法
missing字典或其子类使用__getitem__()调用时,key不存在执行该方法
可调用对象

Python中一切皆对象,函数也不例外

方法意义
call类中定义一个该方法,实例就可以像函数一样调用
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值