当前位置: 首页 > 面试题库 >

为什么python在某些事情上使用两个下划线?

谭嘉容
2023-03-14
问题内容

我对实际的编程语言还很陌生,而Python是我的第一个。我对Linux有一点了解,足以应付暑假工作(我还在读高中),在工作中,我有很多空闲时间用来学习Python。

一件事一直让我着迷。当您拥有以下表达式时,Python中到底有什么不同?

x.__add__(y) <==> x+y
x.__getattribute__('foo') <==> x.foo

我知道什么方法可以做什么,什么东西我可以得到,但是我的问题是:上面的双下划线方法与看起来更简单的等价方法有什么不同?

PS,我不介意接受有关编程历史的讲座,实际上,我发现了解它非常有用:)如果这些主要是Python的历史方面,请随时开始学习。


问题答案:

好吧,对于程序员来说,能力是件好事,因此应该有一种自定义行为的方法。像运算符重载(__add____div____ge__,…),访问属性(__getattribute____getattr__(这两个是不同的充),__delattr__1到相应的方法:,…)等等。在许多情况下,如操作者,通常的语法映射1。在其他情况下,存在一个特殊的过程,该过程有时会涉及调用相应的方法-
例如,__getattr__仅在对象不具有所请求的属性__getattribute__且未实现或引发AttributeError时才调用。其中一些是真正的高级主题,可让您深入了解对象系统的勇气,而很少需要它们。因此,无需全部学习,只需在需要/想要知道时查阅参考。说到参考,在这里。



 类似资料:
  • 问题内容: 为什么 工作,但是 不是吗 问题答案: 为了理解这一点,让我们考虑一下编译器在两种可能性下每个步骤所做的事情。让我们开始: 编译器将‘4’转换为int。所以变成 然后编译器变成 ch是一个字符,编译器可以将54转换为字符,因为它可以证明转换没有损失。 现在让我们考虑第二个版本: ch在编译时没有已知值。因此,这成为 现在,编译器无法证明此(int)的结果在char范围内可存储。因此它

  • 问题内容: 这种“强调”似乎经常发生,我想知道这是否是Python语言中的要求,还是仅仅是一个约定问题? 另外,有人可以说出并解释哪些函数倾向于带有下划线,以及为什么(例如)? 问题答案: 从Python PEP 8-Python代码样式指南: [描述性:命名样式](https://www.python.org/dev/peps/pep-0008/#descriptive-naming- styl

  • 我们最近在系统中遇到了一个性能问题,Logback调用了toString(),尽管指定的日志级别(DEBUG)没有为该特定的日志记录程序启用。当然,现在还有一个额外的问题是我们的toString()方法非常占用CPU,但logback的行为非常出乎意料。给定以下简单的测试案例,日志级别为mypkg。LogTest2未指定(默认),我看到toString()调用了两次,但没有打印日志消息(注意:针对

  • 我目前正在承担一个项目,我正在使用Java微基准线束(JMH)框架测量Java中不同类型循环的速度。我得到了一些关于流的有趣结果,我无法解释,并且想知道是否更了解流和数组列表的人可以帮助我解释我的结果。 基本上,当遍历大小为100的数组列表时,stream.forEach方法比任何其他类型的循环都快得多: 我的结果图表显示在这里:https://i.imgur.com/ypXoWWq.png 我尝

  • 我可以看到jconsole上的一些方法被禁用了。 下面是的屏幕截图 这些MBean方法的javadocs没有指定关于可访问性部分的任何内容。 我认为这是一个安全功能,但我不能得到一个具体的答案。 这个问题的第二个显而易见的部分是如何创建自定义MBean实现,该实现可以在JConsole上选择性地禁用。 以下是系统配置: JConsole版本“1.7.0-B147” Java(TM)SE运行时环境(

  • 我正在测试一些东西,遇到了一个奇怪的情况,当我有一个断点时,IntelliJ没有调试我的代码,如图1所示。但是当我移动断点时,工作正常。 代码: 当我在这里有我的调试点时(见图),这不起作用并给出以下错误: 错误: 连接到目标虚拟机,地址:“127.0.0.1:59776”,传输:“socket”OpenJDK 64位服务器虚拟机警告:共享仅支持引导加载程序类,因为已附加引导类路径,与目标虚拟机断