Python魔术方法

1. 查看属性

  方法: __dir__

  意义: 返回类或者对象的所有成员名称列表。dir()函数就是调用__dir__()。如果提供__dir__(),则返回属性的列表,否则会尽量从__dict__属性中收集信息。

  如果dir([obj])参数包含方法__dict__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

  dir()对于不同类型的对象具有不同的行为:

    如果对象是模块对象,列表包含模块的属性名。

    如果对象是类型或者类对象,列表包含类的属性名,及它的基类的属性名。

    否则,列表包含对象的属性名,它的类的属性名和类的基类的属性名。

# animal.py

# cat.py

2. 魔术方法

分类:

  创建与销毁: __init__与__del__、hash:可哈希、bool:布尔、可视化、运算符重载、容器和大小、可调用对象、上下文管理、反射、描述器、其他杂项

  方法:__hash__

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

  方法: __eq__

  意义:对应于==操作符,判断2个对象是否相等,返回bool值

  __hash__方法只是返回一个hash值作为set的key,但是去重还需要__eq__来判断2个对象是否相等。

  hash值相等,只是hash冲突,不能说明两个对象是相等的。

  因此,一般来说提供__hash__方法是为了作为set或者dict的key的,所以去重需要同时提供__eq__方法。

  1. 练习:设计二维坐标类Point,比较2个坐标是否相等?

思考:list类为什么不可hash?

  源码中有一句__hash__=None,也就是如果调用__hash__()相当于None(),一定会报错。

  所有类都继承自object,而这个类是具有__hash__()方法的,如果一个类不能被hash,就是把__hash__设置为None了。

  方法:__bool__

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

可视化:

  方法:__repr__

  意义:内建函数repr()对一个对象获取字符串表达。如果一个定义了__repr()但没有定义__str__,那么在请求该类的实例的“非正式”的字符串表示时也将调用__repr__()

  方法:__str__

  意义:str()函数、内建函数format、print()函数调用,需要返回对象的字符串表达

  方法:__bytes__

  意义:bytes的时候,返回一个对象的bytes表达,即返回bytes对象

时间: 2024-10-10 11:57:46

Python魔术方法的相关文章

Python 魔术方法笔记

魔术方法总是被__包围, 如__init__ , __len__都是常见的魔术方法,这里主要写一下我遇到的一些魔术方法 setitem 对某个索引值赋值时 即可以进行赋值操作,如 def __setitem__(self, k, v): self.put(k, v) 在上述代码的情况下,可以执行p['key'] = value操作,即将key赋给k,value赋给v,执行put(k, v)函数.所以,__setitem__建立的前提,是要这个函数内的操作本来具有赋值的性质. getitem 使用

[学习记录]python魔术方法与抽象方法like型反思

之前一直没搞懂python的魔术方法是怎么回事,今天看到一篇讲的很好的文章,这里先把链接贴出来 总的来说魔术方法就是定义成用两条下划线包围方法名前后的一种方法,例如__init__,__del__等等 换句话说,当你在python中使用dir()时,看到的那么一大堆__方法__都是魔术方法,如下图 test类只定义了一个hello方法,但是dir展示了大量的魔术方法.这些魔术方法都是内置的,但是允许我们对它们进行重写. 对比一下会感觉有点像定义的接口类的抽象方法,定义出来作为模板,然后由子类对其

032.Python魔术方法__new__和单态模式

一 __new__ 魔术方法 1.1 介绍 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值:通常返回对象或None 对象.属性 对象.方法() 类.属性 类.方法() 1.2 基本用法 class MyClass(): abc = 123 def __new__(cls): #把class这个类传递__new__这个方法 print (123) return None #返回一个None

Python 魔术方法及调用方式

魔术方法 调用方式 解释 __new__(cls [,...]) instance = MyClass(arg1, arg2) __new__ 在创建实例的时候被调用 __init__(self [,...]) instance = MyClass(arg1, arg2) __init__ 在创建实例的时候被调用 __cmp__(self, other) self == other, self > other, 等. 在比较的时候调用 __pos__(self) +self 一元加运算符 __n

python 魔术方法

import time func_count_time_dict = {} def count_time(func): global func_count_time_dict func_count_time_dict[func]=[1,time.localtime()] def wrapper(): global func_count_time_dict func() print 'func name: ',func.__name__ print 'count: ',func_count_tim

流动python - 什么是魔术方法(magic method)

我们经常看到各种各样的方法已经被包围了由双下划线,例如__init__,他们是魔术方法. 魔术方法python语言预订好"协议",在不同情况下不同的魔术方法,是隐式调用.我们重写这些方法,因此,操纵各种行为. class A(object): def __str__(self): return "I am A,2333" def __len__(self): return 42 a = A() print a#输出 "I am A,2333" p

飘逸的python - 什么是魔术方法(magic method)

我们经常看到各种被双下划线环绕的方法,如__init__,它们就是魔术方法. 魔术方法是python语言预定好的"协议",不同魔术方法在不同场景下,会被隐式调用.我们通过重载这些方法,从而操控各种行为. class A(object): def __str__(self): return "I am A,2333" def __len__(self): return 42 a = A() print a#输出 "I am A,2333" prin

python魔法方法

Python 魔术方法指南 入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教程为我的数篇文章中的一个重点.主题是魔术方法. 什么是魔术方法?他们是面向对象的Python的一切.他们是可以给你的类增加”magic”的特殊方法.他们总是被双下划线所包围(e.g. __init__ 或者 __lt__).然而他们的文档却远没有提供应该有的内容.Pyth

python中类的魔术方法

目的:学习python中class的magic methods,提高编程效率. 环境:ubuntu 16.4   python 3.5.2 在学习class是一定会接触到它的magic methods,比如常用__init__,形式都是前后有双下划线.除了这个必须的,还有其他有用的方法,下面大概的介绍一下. 运算魔法方法: __add__ 用作 + __sub__ 用作 - __mul__ 用作 * __truediv__用作/ __floordiv__用作// __mod__用作% __pow