python魔术方法由谁定义_Python的魔术方法

魔术方法就是在定义的类中定义一些”不一般”的方法,使类的使用更方便、完善、健壮,是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.comefc533fe888b98268019472f03ffbd88.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swagger在header中添加token

概述平常做项目使用mvcwebapi&#xff0c;采取前后端分离的方式&#xff0c;后台提供API接口给前端开发人员。这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员。为了解决这个问题&#xff0c;项目中引用swagger&#xff08;我比较喜欢戏称为“丝袜哥”&…

mysql中有没有单行函数_MySQL之函数(单行函数、分组函数)

##进阶函数/*调用语法&#xff1a;select函数名(实参列表)&#xff1b;分组函数和单行函数的区别&#xff1a;单行函数&#xff1a;将一个数据进行处理&#xff0c;返回一个值分组函数&#xff1a;将虚拟表看做一个组&#xff0c;处理一组数据&#xff0c;返回一个值常见的分组…

如何在 C# 中使用 数据注解

数据注解 是一种可以应用到 类 或者 类成员上用来指定类之间关系的一种 Attribute&#xff0c;它的应用场景比较多&#xff0c;可用来描述 UI 上如何进行数据展示&#xff0c;还可以用来做类属性的规则验证&#xff0c;这篇文章就来讨论为什么 注解 值得你去学习&#xff0c;以…

mysql判断是否在日期区间_通过sql判断时间区间是否存在数据

在做项目的时候遇到过一个问题&#xff0c;用户需要获取当前月或者几个月的数据&#xff0c;但是有一个要求&#xff0c;如果已经存在一张单已经包含了这几个月的数据&#xff0c;那么就不能再提取到重复的数据。其实这个问题&#xff0c;我做完了我的方式之后才发现&#xff0…

2020年中国.NET开发者大会第二天 WorkShop

工作坊1&#xff1a;使用 NCF 从 0 到 1 快速模块化开发/部署业务系统实战工作坊简介&#xff1a;本次工作坊由盛派开发团队亲自带领开发者使用 NCF&#xff08;NeuCharFramework&#xff09; 框架进行系统快速开发&#xff0c;进行现场实操训练&#xff0c;大家可以通过本次活…

mysql直接生成excel_MYSQL 将excel里面的数据直接生成sql语句

如何使用EXCEL生成SQL语句&#xff1f;将光标放到新的列上里面&#xff0c;然后在公式栏里面输入如下公式&#xff1a;"insert into t values("&A1&","&B1&","&C1&","&D1&")"效果图&#x…

OrchardCore实现模块化核心原理分析

【导读】ABP vNext并未过多探究&#xff0c;当然其基于DDD理念分层清晰&#xff0c;灵活性、扩展性自然也不在话下&#xff0c;但有些情况下我可能会首选OrchardCore&#xff0c;并非ABP vNext不可若改造项目&#xff0c;也因历史遗留问题&#xff0c;数据库表设计也可能存在不…

sqoop将hive导出到mysql_Sqoop hive导出到mysql[转]

通过Sqoop将Hive表数据导入到MySQL通常有两种情况。第一种是将hive上某张表的全部数据导入到mysql对应的表中。第二种是将hive上某张表中的部分数据导入到mysql对应的表中。两种方式的区别在于第二种情况需要指定要导入数据的列名称。两种情况的导入方式分别如下&#xff1a;1.…

.NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记

2.2.3 核心模块--配置IConfigurationOptionsASP.NET Core 中的配置&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?viewaspnetcore-5.0IConfigurationIConfiguration 的使用层级对象配置到 key-value 键值对转换通过环境变量修改日志…

java分桃子_猴子分桃子.java

问题描述&#xff1a;猴子分桃&#xff1a;海 滩上有一堆桃子&#xff0c;五只猴子来分。第一只猴子把这堆桃子凭据分为五份&#xff0c;多了一个&#xff0c;这只猴子把多的一个扔入海中&#xff0c;拿走了一份。第二只猴子把剩下的桃子又平均分成五份&#xff0c;又多了一个&…

.NET Conf 2020 - 基于ASP.NET Core构建可热插拔的插件化系统

文章标题&#xff1a;.NET Conf 2020 - 基于ASP.NET Core构建可热插拔的插件化系统作者&#xff1a;Lamond Lu项目地址&#xff1a;https://github.com/lamondlu/CoolCat博客&#xff1a;http://www.cnblogs.com/lwqlun以下是2020.12.19日的演讲文稿和视频&#xff1a;大家好&a…

java获取机器号_(转)JAVA获得机器码的实现

http://yangshangchuan.iteye.com/blog/2012401首先&#xff0c;定义了一个统一的接口&#xff0c;以支持不同操作系统不同实现的透明切换&#xff1a;Java代码 收藏代码/***生成机器码的接口&#xff0c;不同平台有不同实现* author 杨尚川*/public interface SequenceServic…

多款主流编程语言,哪款开发软件最安全?

喜欢就关注我们吧&#xff01;在当下的市场环境中&#xff0c;除了掌握困扰软件的最常见安全问题外&#xff0c;开发人员还应该了解到底是什么问题在影响他们正在使用的编程语言。静态代码分析安全公司 Veracode 最近发布了一份年度软件安全状态&#xff08;SOSS&#xff09;报…

Java pdf文件传输_java中pdf文件的管理(pdf文件转png文件,base64传输文件以及删除)...

org.apache.pdfboxpdfbox2.0.12影像文件转为base64编码使用java自带的BASE64Encoder类代码部分&#xff1a;前端上传文件的保存&#xff1a;RequestMapping("upLoadImgs")ResponseBodypublic String upLoadAgreementsImg(HttpServletResponse response, HttpServletR…

【对比学习】koa.js、Gin与asp.net core——中间件

web框架中间件对比编程语言都有所不同&#xff0c;各个语言解决同一类问题而设计的框架&#xff0c;确有共通之处&#xff0c;毕竟是解决同一类问题&#xff0c;面临的挑战大致相同&#xff0c;比如身份验证&#xff0c;api授权等等&#xff0c;鄙人对node.js&#xff0c;golan…

java 传送解析8583报文_java发送ISO8583报文接口案例

【实例简介】java发送ISO8583报文实现平安银行支付接口【实例截图】【核心代码】pingAnBank└── pingAnBank├── build.xml├── client│ ├── ClientBean.java│ ├── UDPClient.java│ └── UdpClientSocket.java├── com│ └── solab│ └── i…

2020年终回顾:时间会回答成长,成长会回答梦想

前言2020年是脚踏实地&#xff0c;慢慢成长的一年&#xff0c;由于疫情的缘故&#xff0c;今年社区没有像去年一样举办多场线下活动&#xff0c;不过 .NET CONF CHINA 大会昨天也在苏州顺利召开&#xff0c;回顾这一年&#xff0c;也有不少惊喜与感悟2020年回顾公众号自从去年双…

java servlet 跳转_Servlet跳转方式sendReDirect()和forward()

在web应用服务中&#xff0c;经常会面对不同SERVLET之间的跳转&#xff0c;目前我们可以通过以下两种方式实现&#xff1a;1.RequestDispatcher.forward()2.ServletResponse.sendReDirect()两者的区别&#xff1a;1.redirect 方式可以跨应用访问,forward 只能在同一个应用中跳转…

明天面腾讯,我刷了这71道面试题...

激动人心的Conf 2020中国.NET开发者大会完美落幕&#xff0c;有幸去到现场&#xff0c;跟诸位.NET大佬、微软大咖、MVP面对面交流&#xff0c;内心很是鸡冻&#xff01;聊天中我注意到一个细节&#xff0c;很多公司的项目都在逐步用MySQL替换SQLServer&#xff0c;尤其是微服务…

java 毕向东 内部类_java基础内部类(毕向东老师)

内部类//特点&#xff1a;内部类可以直接访问外部类的成员&#xff0c;//外部类要访问内部类中的成员必须创建内部类的对象。//为什么要定义内部类呢&#xff1f;类是用于描述事物的&#xff0c;而事务中如果还有具体的事物&#xff0c;而且这个内部的事物在访问着所属事物中的…