最近发现同学们的问题保持了一致,都是在问我一些魔法方法的使用及意义,所以在这里也是专门给大家整理一份魔法方法的详解及使用集合。

众所周知,方法是需要调用执行的,而魔法方法则不一样,他无需你的调用,在特定的时候会自己执行。

__init__方法

__init__方法是类在创建实例的那一瞬间,就会默认调用的方法,而定义在这个方法里的属性,我们称它为初始化属性,多说无益,我们直接上代码。

class Person(object):

def __init__(self):

print('大家好,我是渣渣辉')

p1 = Person()

···

执行结果:

大家好,我是渣渣辉

__new__方法

大家刚才看到了这个__init__方法的效果,肯定都会认为这个方法是类中第一个执行的方法,其实并不然,我们的类最开始调用的是__new__方法,它的第一参数是它的类对象,其他的参数则是传递给__init__方法的,,_new__方法可以调用其他的类的方法或者返回别的实例来作为当前类的实例,所以如果__new__方法没有返回实例,那么__init__方法就不会被调用,所以__new__方法决定了__init__方法是否使用,也可以说实例就是__new__方法创建的。__new__方法的主要用途是当你继承了一些不可更改的属性的时候,给你提供一个途径去修改它。

class Person(int):

def __new__(cls, value):

return super(Person, cls).__new__(cls, abs(value))

p1 = Person(-1)

print('p1 = ', p1)

执行结果:

p1 =  1

__str__方法

__str__方法是用来显示信息的,通常是用来返回一个字符串,作为这个实例对象的描述信息,它只有一个参数,需要return一个数据,当你在类的外部打印实例对象的时候则会打印这个数据,在使用print(对象)或者str(对象)的时候会触发此方法。

class Person(object):

def __init__(self):

self.name = '渣渣辉'

self.age = 18

def __str__(self):

return '我是%s,今年%s,快来砍我' % (self.name, self.age)

p1 = Person()

print(p1)

执行结果:

我是渣渣辉,今年18,快来砍我

在使用print()函数输出对象名称的时候默认的情况会打印对象名引用的内存地址,如果想要打印对象的属性值,可以使用__str__(self)这个方法。

__call__方法

__call__方法可以是类的实例对象能像调用函数那样使用对象。它的作用是简化了对象下方法的使用,模糊了对象和函数调用时的区别。

使用__call__前

class Person(object):

def demo(self):

print('p1')

p1 = Person()

p1.demo()

执行结果:

p1

使用__call__后

class Person(object):

def __call__(self):

print('p1')

p1 = Person()

p1()

执行结果:

p1

使用__call__方法实现斐波那契数列

class Fibonacci(object):

def __call__(self, num):

a, b = 1, 1

self.lst = []

if num <= 2:

self.lst.append(a)

self.lst.append(b)

else:

for i in range(1, num + 1):

self.lst.append(a)

a, b = b, a + b

return self.lst

fibo = Fibonacci()

ret = fibo(10)

print(ret)

执行结果:

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

__dir__方法

熟悉python的人都知道dir()方法可以让我们查看当前环境下有些什么样的方法和属性可以使用,通过dir(object)可以获得一个对象拥有的方法和属性,同样的道理,如果我们自己在类中定义了这个__dir__方法,我们就可以指定一些别人能够被调用的方法,你的协同开发者就可以通过调用dir()方法查看到并使用。

class Person(object):

def __init__(self):

self.name = '渣渣辉'

self.age = 18

self.gender = '男'

def chuanqi(self):

print('快来和我一起砍传奇')

p1 = Person()

print(dir(p1))

执行结果:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'chuanqi', 'gender', 'name']

__del__方法

在一个实例被销毁时,__del__方法会执行,该方法是解释器自动调用的,一般不需要重写。

class Person(object):

def __del__(self):

print("销毁")

print("自动调用del")

p1 = Person()

执行结果:

销毁

自动调用del

__getattr__方法

当我们访问一个不存在的属性时会调用次方法,如果属性存在则不调用。

如果我们不重写__getattr__方法,当我们访问一个不存在的属性时会抛出AtrributeError的错误。

class Person(object):

def __init__(self,name):

self.name = name

def __getattr__(self, item):

print("不存在的属性")

return item

p1 = Person("渣渣辉")

print(p1.name)

print(p1.age)#age属性不存在

执行结果:

渣渣辉

不存在的属性

age

__setattr__方法

所有的属性设置都会调用此方法,并且只有拥有这个魔法方法的对象才可以设置属性,使用这个方法要注意的是不要被循环调用。

class Person(object):

def __init__(self, name):

self.name = name

def __setattr__(self, name, value):

print("执行__setattr__")

object.__setattr__(self, name, value)

p1 = Person("渣渣辉")

print(p1.name)

执行结果:

执行__setattr__

渣渣辉

__dict__方法

__dict__方法可以被认为是一个管理系统,它管理着类中存储的各种属性,当我们创建类属性或者实例属性的时候,就会将这些信息保存到__dict__魔法方法内部,我们使用的时候再从它内部取出来。当我们用实例对象点上__dict__的方法时,就可以读取到当前实例对象的属性。

class Person(object):

def __init__(self):

self.name = '渣渣辉'

self.age = 18

self.gender = '男'

p1 = Person()

print(p1.__dict__)

执行结果:

{'name': '渣渣辉', 'age': 18, 'gender': '男'}

__eq__方法

在做对象比较的时候,我们实际上调用的方法就是__eq__方法,默认比较的是内存地址,如果要改变比较方式,可以重写__eq__方法。

class Person(object):

def __init__(self, name, age):

self.name = name

self.age = age

def __eq__(self, other):

return self.__dict__ == other.__dict__

per1 = Person('lee', 10)

per2 = Person('lee', 10)

print(per1 == per2)

print(per1 is per2)

执行结果:

True

False

这些就是我们经常可能用到的魔法方法,希望大家能够有所得,记得献上你们的小红心哦!!!

python 魔法方法常用的有_【Python】面向对象常用魔法方法集合相关推荐

  1. python 找到目录下文件名规则_假如编程是魔法之零基础看得懂的Python入门教程 ——(二)魔法实习生第一步了解魔杖的使用...

    学习目标 了解什么是开发环境 了解python语言的环境安装 了解python语言编程的编辑器工具 一.打怪升级你先得了解武器使用的条件 对于很多第一次学习编程的同学对于很多定义性的概念大多都不了解, ...

  2. python系统提供构造函数传入参数_[ Python入门教程 ] Python函数定义和使用

    函数是一段可以重复多次调用的代码,通过输入的参数值,返回需要的结果.通过使用函数,可以提高代码的重复利用率.本文主要介绍Python函数的定义.调用和函数参数设置方法. 函数的定义 Python函数定 ...

  3. python字符串与列表与运算_[Python学习笔记1]Python语言基础 数学运算符 字符串 列表...

    这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档: ...

  4. python处理字符串获取其后六位_[Python]六、字符串

    字符串就是一串字符,是编程语言中表示文本的数据类型 在Python中绝大多数用双引号定义,也可用单引号 str1 = "hello python" str2 = '我的外号是&qu ...

  5. python中for循环的用法_@Python小白,一文让你掌握Python爬虫

    兴趣 我没事喜欢逛知乎,有一段时间看到了这个问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情: http://t.cn/RptGOPx 觉得回答的一个个炒鸡酷炫 就对爬虫产生了浓厚的兴趣, 于是就开 ...

  6. python打开excel执行vba代码_“Python替代Excel Vba”系列(终):vba中调用Python

    请关注本号,后续会有更多相关教程. 系列文章 学Python还不会处理Excel数据?带你用pandas玩转各种数据处理"Python替代Excel Vba"系列(二):panda ...

  7. python数值类型不包含复数_[python学习手册-笔记]003.数值类型

    003.数值类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...

  8. python爬虫项目实战教学视频_('[Python爬虫]---Python爬虫进阶项目实战视频',)

    爬虫]---Python 爬虫进阶项目实战 1- Python3+Pip环境配置 2- MongoDB环境配置 3- Redis环境配置 4- 4-MySQL的安装 5- 5-Python多版本共存配 ...

  9. python三维图如何标注曲面_(python)使用colormap作为第4维,x,y,z函数绘制3d曲面 - python...

    我正在尝试绘制3d曲面,其中三个维度中的每个维度都在单独的值数组中,并且每个坐标处的曲面着色是x,y,z的函数.一种numpy.pcolormesh,但是是4D而不是3D的. 3D图由下式给出: fr ...

  10. python c++情侣网名含义_#python和C/C++#让python和C/C++联姻

    让python不在孤单,轻易而举的为python写C/C++第三方库. 我们都知道python很慢,特别是处理大数据的时候,简直慢到极致,如果在知道代码的瓶颈的时候,可以将需要大量计算的数据块放在C/ ...

最新文章

  1. ldconfig提示is not a symbolic link警告的去除方法
  2. leetcode - 150. Evaluate Reverse Polish Notation
  3. 【090】Excel VBA 基础
  4. 架构师究竟要不要写代码?
  5. 用C#实现计算机图形学算法
  6. 08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)
  7. Vue项目开发目录结构和引用调用关系
  8. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day7
  9. 【CSharp】C#中equals与==小记
  10. SQL server 2008配置与用户名登录
  11. 解决办法:char类型的实参与LPCWSTR类型的形参类型不兼容
  12. jdbc 生成建表语句_记录一次TDH的inceptor导出建表语句和数据
  13. 导出数据到txt文本
  14. android 下载instagram动态中图片的demo
  15. ubuntu上传代码文件到github
  16. 《聪明人用方格笔记本》读书笔记
  17. [转]数码单反和普通数码相机的差别
  18. Redis入门到实战(实战篇)缓存更新、穿透、雪崩、击穿!
  19. 给div添加点击效果
  20. cxf webservice接口

热门文章

  1. 一个隐藏着的僵尸巨兽 Ponmocup 僵尸网络
  2. python原子_Python的原子性操作是如何实现的
  3. 《给研究生的学术建议》5——人际关系网络
  4. oracle给已有用户指定表空间,Oracle创建用户、表空间及为用户指定表空间
  5. idata免费下载三篇文献
  6. carbon安装win7 thinkpad x1_ThinkPad New X1 Carbon是否可以安装Windows 7操作系统?
  7. 错误:ssh:could not resolve ....
  8. fp算法例题_Kmeans算法找相似商品、FP树找频繁项集
  9. 有关watchdog的个人学习
  10. 用Python下载视频,保存至文件的demo