python的魔法函数

hello, 大家好, 今天给大家分享一点python的魔法函数,即Python中自带双下划线的函数,虽然在大规模的软件开发中大家用的不多,当然除非你想被打(可以秀(装逼)一下), 虽然使用的不多, 但是要是能数量的运用它们的话, 没有点功力基础也是相当困难的, 正所谓没有扎实的基本功,即便南拳北腿,降龙十八掌,九阴白骨爪,乾坤大挪移全部了然于心,照样是花拳绣腿,百无一用

所以还是老老实实的把自己的基本功练好,面向对象玩的炉火纯青,其他的不过是稍加训练,跟卖艺的学几招也能称霸一片天。哈哈 牛吹的太过了, 还是回到正题,总结分享一下一些稍微不太熟悉的魔法方法。

一、__str__():

它表示的是直接打印对象实现的方法,__str__是被print函数调用的, 一般都是返回一个值, 这个值是以字符串方式表现的,需要注意的是必须是返回一个字符串类型的,不然会抛出异常:

这样一来的话在面向对象中我们就可以按照自己的想法去打印我们想要的的结果了。

二、__call__():

对象通过__call__()的方法可以是对象模拟函数的行为,即具体在__call__函数里面定义我们想要的的函数,或者返回传入参数的倍数或者其他拼接的信息等,这样的效果是我们可以像使用函数一样去使用类,也是一件很有意思的事。(嗯, 就像拖鞋不只是用来穿的)

三、__repr__():

与str类似, 但是str用于将值转化为适合人阅读的形式,但是repr转化为的是供解释器读取的形式,区别就是后者在str()函数或者print函数打印一个函数的时候被使用,且它返回的字符串对终端用户更友好,如果只想实现一个,使用repr会更好,因为如果一个对象没有str函数,然而Python又需要调用它的时候,解释器会用repr作为替代去配合调用。常见的用法就是我需要输出一个自己加工的数据的时候,重写这个方法,这样再调用print()或者repr的方法时,就能调出我们期望的数据。

四、__setattr__():

该方法会拦截所有的赋值语句,如果定义了,self.attr = value就会变成self.__setattr__("attr", value), 需要注意的是当在__setattr__方法里边对属性进行赋值的时候,不能使用self.attr = value, 因为会再次调用self.__setattr__("attr", value),导致堆栈溢出。应该使用self.__dict__[‘name‘] = value即对属性字典做索引运算来赋值。

常规对属性赋值被赋值的属性和值会存入实例属性字典__dict__中

如果自定义了__setattr__,对实例属性的赋值就会调用它。类定义中的self.attr也同样,所以在__setattr__下还有self.attr的赋值操作就会出现无线递归的调用__setattr__的情况。自己实现__setattr__有很大风险,一般情况都还是继承object类的__setattr__方法。

五、 __getattr__():

拦截点号运算。当对未定义属性名称和实例进行点号运算时,就会用属性,名作为字符串调用这个方法,如果继承树可以找到该属性,则不调用。即当我们实例化一个对象,当某属性可以通过正常机制追溯到即在对象.__dict__中可以找到时,不会调用该方法。

六、__delattr__():

需要注意的是和__setattr__一样,适用于删除对象的某个属性时才用到。

七、__eq__():

用来判断两个对象的值是否相等,"=="会触发这个方法。

如果我们不重写的话,会默认调用object中的__eq__方法, 那个比较严格,有时候不好判断两个对象是否相等, 这个会经常进行重写。

好啦, 今天的魔法方法就分享到这吧,当然还有其他的魔法方法, 比如__class__, __doc__, __name__等其他方法,这些方法都是我们比较常用的,也就没必要小猿在这里再啰嗦一遍,希望能给在Python或者其他语言带来点启发, 你的关注和感悟是小猿我分享知识,继续推送的最大动力。大家一起努力。

原文地址:https://www.cnblogs.com/f-g-f/p/12142862.html

时间: 2024-12-08 16:22:27

python的魔法函数的相关文章

gj3 Python数据模型(魔法函数)

3.1 什么是魔法函数 类里面,实现某些特性的内置函数,类似 def __xx__(): 的形式. 不要自己定义XX,并不是和某个类挂钩的 class Company(object): def __init__(self, employee_list): self.employee = employee_list # 可迭代 def __getitem__(self, item): return self.employee[item] # 长度,实现了len函数 def __len__(self

Python的魔法函数系列 __getattrbute__和__getattr__

  #!/usr/bin/env python # -*- coding: utf-8 -*- import sys __metaclass__ = type """ __getattr__ 和 __getattribute__ 的区别 """ class ClassName: def __init__(self, name, info={}): self.name = name self.info = info # def __getattri

python内置函数和魔法函数

内置方法:Python中声明每一个类系统都会加上一些默认内置方法,提供给系统调用该类的对象时使用.比如需要实例化一个对象时,需要调用该类的init方法:使用print去打印一个类时,其实调用的是str方法等等. init(self, …):初始化对象class,在创建新对象时调用.在方法里,可以初始化该对象的属性,否则调用其他时可能出“现has no attribute”错误: del(self):释放对象,在对象被虚拟机删除之前调用: new(cls,*args,**kwd):实例的生成操作,

python魔法函数之__getitem__

魔法函数会增强python类的类型,独立存在 class Company: def __init__(self, employees): self.employees = employees def __getitem__(self, item): return self.employees[item] company = Company(['a', 'b', 'c']) for val in company: print(val) company1 = company[:2] for val

如何在Python中快速画图——使用Jupyter notebook的魔法函数(magic function)matplotlib inline

如何在Python中快速画图--使用Jupyter notebook的魔法函数(magic function)matplotlib inline 先展示一段相关的代码: #we test the accuracy of knn and find the k which makes the biggest accuracy k_range=list(range(1,26))#[1,25] scores=[] for k in k_range: knn=KNeighborsClassifier(n_

python魔法函数的一些疑问

看了魔法函数,有一点疑问.1中需要用self.word才能执行,而2直接用self就可以执行.而1中Word继承了int基本类型,但在__new__时并没有什么卵用.当用 Word(“123”)来实例化时,看到的运算结果是以字符串形式来进行运算的,比如“123”*3=123123123. 1. class Word(int): def __new__(cls, word): word = int(word) return int.__new__(cls,word) def __init__(se

009_python魔法函数

11. (译)Python魔法方法指南 原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://github.com/RafeKettler/magicmethods Contents (译)Python魔法方法指南 简介 构造方法 操作符 比较操作符 数值操作符 一元操作符 常见算数操作符 反射算数运算符 增强赋值运算符 类型转换操作符 类的表示 访问控制

Python 中的函数的双下划线“__”

Python中最常见的是类中的带有双下滑线的函数是 __init__()最开始只是知道 有初始化的作用,这里从原理上总结一下. 在Python中,由这些名字组成的集合所包含的方法称为特殊方法.如果对象实现了这些方法中的某一个,那么这个方法会在特殊情况下(确切的说是根据名字)被Python调用.而几乎没有直接调用它们的必要. 一.首先讨论__init__(),标准来说它是类的构造方法.当一个对象被创建后,会立即调用构造方法. class Test: def __init__(self): self

魔法函数

1.什么是魔法函数 在python中,有的名称以双下划线开头同时以双下划线结尾这种形式,我们只知道它是python自己定义的,同时我们也不应该去定义类似的函数. 我们将“__init__”这种形式的函数成为魔法函数."__init__"是构造器,用来初始化对象.魔法函数不需要去显式的调用,同时魔法函数不能自定义.魔法函数会被python隐式的去被调用. 举个简单的例子:现在我们需要遍历对象中的属性,传统做法是取属性然后去遍历. class Person(object): def __i