魔术方法就是在定义的类中定义一些”不一般”的方法,使类的使用更方便、完善、健壮,是python特有的方法,一般都是前后包含两个下划线__的方法称为魔术方法,例如__new__。

基本魔术方法有哪些__new__:是在一个对象实例化的时候所调用的第一个方法,用来创建类并返回这个类的实例;

class Student:

def __init__(self):

print("__init__()调用")

def __new__(cls, *args, **kwargs):

print('__new__()调用,{cls}'.format(cls=cls))

return object.__new__(cls, *args, **kwargs)

stu = Student()

# 输出结果:

__new__()调用,

__init__()调用

很明显可以看出,先调用了__new__方法,然后调用了__init__方法__init__:构造器,是一个初始化方法,在一个实例被创建之后调用;

__del__:析构器,当一个实例被销毁的时候调用的方法;

__bool__:如果对象实现了bool方法,那么返回结果,非0为真,如果没有实现bool方法,调用len方法,返回非0为真;

__hash__:返回一个整数,表明对象可以hash;

__repr__:返回对象的字符串表达式,如果没有实现,直接返回对象内存地址字符串;

__str__:str()、print()、format()函数打印对象字符串,会直接调用str方法,如果没有实现,会调用repr方法;

__hash__:定义当被 hash() 调用时的行为;

__bytes__:定义当被 bytes() 调用时的行为;

__format__:定义当被 format() 调用时的行为;

有关属性魔术方法有哪些__getattr__:定义当用户试图获取一个不存在的属性时的行为;

__setattr__:定义当一个属性被设置时的行为;

__getattribute__:定义当该类的属性被访问时的行为;

__delattr__:删除一个属性时执行的方法;

__dir__:定义当 dir() 被调用时的行为;

__get__:定义当描述符的值被取得时的行为;

__set__:定义当描述符的值被改变时的行为;

__delete__:定义当描述符的值被删除时的行为;

运算符相关魔术方法有哪些

我们通过一小实例来看一下,有关于运算符相关的魔术方法的使用

class Student:

def __init__(self, x):

self.x = x

def __add__(self, other):

return self.x + other.x

def __sub__(self, other):

return self.x - other.x

def __mul__(self, other):

return self.x * other.x

a = Student(1)

b = Student(2)

c = Student(3)

print(b-a) # 输出:1

print(b+a) # 输出:3

print(b*c) # 输出:6__add__:定义加法的方法;

__sub__:定义减法的方法;

__mul__:定义乘法的方法;

__truediv__:定义除法的方法;

__floordiv__:定义整数除法的行为://;

__mod__:定义取模算法的行为:%;

__divmod__:定义当被 divmod() 调用时的行为;

__pow__:定义当被 power() 调用或 ** 运算时的行为;

__lshift__:定义按位左移位的行为:<

__rshift__:定义按位右移位的行为:>>;

__and__:定义按位与操作的行为:&;

__xor__:定义按位异或操作的行为:^;

__or__:定义按位或操作的行为:|;

比较操作符相关魔术方法有哪些

有关于比较操作符的魔术方法也有很多,下面例子中有__eq__和__lt__的举例,大家自己动手把所有的方法都操作一遍,就能很快理解操作符相关魔术方法的使用了

class Student(object):

def __init__(self, a, b, c):

self.a = a

self.b = b

self.c = c

def __eq__(self, other):

return True if self.a == other.a else False

def __lt__(self, other):

if self.a < other.a:

return True

else:

return False

stu1 = Student(1, 2, 3)

stu2 = Student(3, 2, 1)

stu3 = Student(1, 2, 3)

print(stu1 == stu2) # 输出:False

print(stu1 == stu3) # 输出:True

print(stu1 < stu2) # 输出:True

print(stu1 < stu3) # 输出:False__eq__:定义等于号的方法,等价于==;

__lt__:定义小于号方法,等价于

__gt__:定义大于号方法,等价于>;

__le__:定义小于等于号的行为,等价于 <= ;

__ne__:定义不等号的行为,等价于!= ;

__ge__:定义大于等于号的行为,等价于 >= ;

容器相关的魔术方法有哪些

class Student:

def __init__(self):

self.items = {}

def __len__(self):

return len(self.items)

# 如果stu.items不为空,返回True

def __bool__(self):

return True if len(self) else False

def __iter__(self):

return iter(self.items)

def __getitem__(self, item):

return self.items[item]

def __setitem__(self, key, value):

self.items[key] = value

stu= Student()

stu.items['Course'] = 'Python'

stu.items['Teacher'] = '张三'

print(len(stu))

print(bool(stu))

print(iter(stu))

print(stu['Course'])

stu['Course'] = 'HTML'

print(stu['Course'])__len__:定义当被 len() 调用时的行为(返回容器中元素的个数);

__iter__:定义当迭代容器中的元素的行为;

__getitem__:获取容器中的元素,相当于 self[key];

__setitem__:设置容器中的元素,相当于 self[key] = value;

__delitem__:删除容器中的某个元素,相当于 del self[key];

__reversed__:定义当被 reversed() 调用时的行为;

__contains__:定义当使用成员测试运算符(in 或 not in)时的行为;

可调用对象

# 函数是可调用对象

def add():

pass

add.__call__()

add()

# 类实现了__call__方法

class Add():

def __call__(self, *args, **kwargs):

print(args)

print(kwargs)

add_instance = Add()

add_instance.__call__(1,2,3, course='Python')

add_instance(1,2,3,course='Python')Python中,实现了call方法的对象都是可调用对象;

__call__:允许一个类的实例像函数一样被调用:x(a, b)调用为 x.__call__(a, b);

更多魔术方法的详情可以参考python官网:3. Data model - Python 3.8.2 documentation​docs.python.org

学习Python推荐:侠课岛_短视频在线学习_前后端开发_产品运营_独家原创​www.9xkd.com

python魔术方法由谁定义_Python的魔术方法相关推荐

  1. python类和对象的定义_python类与对象基本语法

    面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 本人学习笔记基于python2的 ...

  2. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

  3. writelines是python对文件的写操作方法_Python File writelines() 方法

    概述 writelines() 方法用于向文件中写入一序列的字符串.高佣联盟 www.cgewang.com 这一序列字符串可以是由迭代对象产生的,如一个字符串列表. 换行需要制定换行符 \n. 语法 ...

  4. python修改类的属性值_python 四种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,直接修改类属性的值...

    三种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,类名就是类对象,city就是类变量, #coding=utf-8 class empl ...

  5. python中用def实现自动排序_Python sorted排序方法如何实现

    在给列表排序时,sorted非常好用,语法如下: sorted(iterable[, cmp[,key[,reverse]]]) sorted定义如下: sorted( iterable[, cmp[ ...

  6. python 子串是否在字符串中_python七种方法判断字符串是否包含子串

    1. 使用 in 和 not in in 和 not in 在 Python 中是很常用的关键字,我们将它们归类为 成员运算符. 使用这两个成员运算符,可以很让我们很直观清晰的判断一个对象是否在另一个 ...

  7. python变量如何用循环定义_Python学习日记1(变量定义,分支,循环)

    学习历程按照Github上jackfrued的100天学习python的进度来进行,再辅上一些自己查找的相关资料. 对应传送门:https://github.com/jackfrued/Python- ...

  8. python中isnumeric函数怎么用_Python中isnumeric()方法的使用简介

    Python中isnumeric()方法的使用简介 isnumeric()方法检查字符串是否仅由数字组成.这种方法只表示为Unicode对象. 注意:要定义一个字符串为Unicode,只需前缀分配'u ...

  9. python调用函数出现未定义_python – 为什么函数参数之外的“self”会给出“未定义”的错误?...

    看看这段代码: class MyClass(): # Why does this give me "NameError: name 'self' is not defined": ...

最新文章

  1. Libzip 版本过低或提示reinstall解决方法
  2. Vue.nextTick()理解
  3. geoTools学习笔记001---(简介)
  4. linux中request_region()函数的分析
  5. [转载] python创建集合、计算a|b_python之路(集合,深浅copy,基础数据补充)
  6. 日请求从百万到八亿的技术历程
  7. 终结者:使用slf4j+log4j完美构建日志
  8. Java程序员在写SQL程序时候常犯的10个错误
  9. prescan学习笔记1
  10. go语言链接show_api,读取网络成语
  11. 关于lua加密luac的有关问题
  12. pandaboard 安装_pandaboard---文件系统的建立(4)
  13. JAVA查电话归属地
  14. mysql 上一周起始时间_mysql 某周的起始和结束日期
  15. No tests were found
  16. bilibili自动上传视频脚本(纯ruby)
  17. 动物拼图代码html,制作动物拼图美术教案
  18. illegal unquoted character
  19. 计算机del键作用,计算机里的英文字母“DEL”键是干什么用的
  20. 转载: 中国大部分程序员的通病

热门文章

  1. asp.net core源码飘香:Configuration组件
  2. 过多提交(Over Posting)
  3. word如何设置上标形式_如何在word中设置特殊页码
  4. ArcGIS 10.2晕渲图+旋转图制作
  5. 利用Excel VBA批量计算气象数据多个台站多年来春季和冬季降水量和平均气温
  6. System.Diagnostics.Process.Start()用法详解
  7. Android之网络请求提示Cleartext HTTP traffic to dev*******.com not permitted
  8. Android之平时遇见的异常和错误总结(不断更新)
  9. Android之URI简介
  10. 这是我第一次使用代码创建出一个窗口【python 游戏实战 01】