比较PHP';Python中带有uu get和u getattr的s uu get()

比较PHP';Python中带有uu get和u getattr的s uu get(),php,python,Php,Python,Python中的\uuu get\uu()和\uu getattr\uu()之间有什么区别?我来自PHP背景,那里只有\uu get()。我应该什么时候使用哪个功能 我想弄清楚这件事已经有一段时间了。我看到很多问题,比如询问\uu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 来自PHP,您应该首先熟悉Python对

Python中的
\uuu get\uu()
\uu getattr\uu()
之间有什么区别?我来自PHP背景,那里只有
\uu get()
。我应该什么时候使用哪个功能


我想弄清楚这件事已经有一段时间了。我看到很多问题,比如询问
\uu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

来自PHP,您应该首先熟悉Python对象模型。它比PHP丰富得多,因此您不应该尝试将PHP知识1:1映射到Python。如果您想开发PHP,请使用PHP。如果您想使用Python进行开发,请学习Python


回到您最初的问题:
\uuuuu getattr\uuuu
可能是与PHP中的
\uuuu get
函数相同的函数\uuuu get\uuuu
用于实现描述符。关于描述符的详细信息也可以在我上面提到的文档中找到。

首先,PHP与Python的
\uu get\uuuu()
没有等价物,甚至还没有接近!你要找的肯定是
\uuu getattr\uuuu()

我来自PHP背景,那里只有
\uuuu get\uuuu

PHP有一个called,当您试图访问一个不存在的属性时,就会调用它

非等价物的简短列表 首先,让我们澄清一些事情:

  • PHP的与Python的
    \uuuu get\uuuuu()有一个等价物
  • PHP没有与Python的
    \uuu getattr\uuuu()等价的代码
  • PHP不具有与Python的
    \uuu getattribute\uuuuu()等价的
  • Python没有与PHP的
    \uu get()
(分别适用于所有setter方法。)

与阿希姆的假设相反,
\uu get()
与Python的
\uu getattr()
做的不一样
Python不区分方法和属性,但PHP区分,这就是为什么PHP有第二个方法:
\uu call()

每当您尝试调用不存在的对象上的方法时,都会执行
\u call()
。Python没有相应的方法,因为方法只是一个可调用的对象(属性)

PHP中的一个示例:


也毫无价值,您几乎不必直接访问这些方法。您可能需要覆盖它们,但您永远不应该调用它们。@Daniel Roseman:几乎永远不会,但是不能被实例隐藏的
classproperty(property)
可能会很方便,使用
def\uu get\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(self,obj,cls):返回self.fget.\uuuuuu获取(type(obj),type(type(type(obj)))(val)
。诚然,
\uuuu getattr\uuuu()
类似于PHP的
\uu get()
,但有一些重要的区别。更多细节请参见我的答案。