为什么对象没有hasattr和getattr作为属性?

2024-03-28 14:51:59 发布

您现在位置:Python中文网/ 问答频道 /正文

当您需要在Python中动态访问对象的属性时,您只需使用内置函数hasattr(object, attribute)或{}。

然而,对于语法来说,这似乎是一个奇怪的顺序。它的可读性和直观性较差,因为它扰乱了英语的常规句子结构。

if hasattr(person, age):
if has attribute Person age

如果把它作为对象的一种方法会更具可读性:

if person.hasattr(age):
if Person has attribute age

不这样做有什么特别的原因吗?我可以想象在某些情况下,你不确定这个对象是否是一个合适的对象,而不仅仅是None,但是在那些不确定的情况下,为了额外的安全,你可以使用内置函数。

有没有其他一些我没有想到的缺点或考虑,使添加这些不值得吗?


Tags: 对象函数ageif属性object情况动态
2条回答

它是语言设计的一部分。我猜你找到了一些关于它背后更复杂思想的文档,但是关键点是

  • 建议在所有对象上使用对象的函数作为内置函数。为什么这个函数应该特定于这个对象?在
  • 语义:getattr函数作用于对象,而不是对象的一部分。在
  • 名称空间:对象的函数由您定义,而不是由语言定义。内部函数的形式是__getattr__,您可以在对象上找到这个函数;-)。getattr在内部使用它,所以你甚至可以覆盖它(如果你知道你在做什么)。在

你会发现很多类似的例子-比如用len(obj)代替obj.length()hash(obj)而不是{},isinstance(obj, cls)而不是{}。您可能还注意到加法的拼写是obj1 + obj2而不是obj1.add(obj2),减法拼写为obj1 - obj2而不是{}等等。。。关键是一些内置的“函数”被视为运算符而不是真正的函数,并且由“u magic_uu”方法(__len____hash____add__等)支持。在

至于“为什么”,你不得不问GvR,但历史原因是,它至少避免了很多名称空间污染/名称冲突。如果length已经是一个“某种类型但不是明确保留”的名称,那么如何命名“Line”或“Rectangle”类的长度?内省应该如何理解Rectangle.length()并不意味着{}是一个类似于序列的对象?在

使用泛型“operator”函数(注意,适当的运算符也作为函数存在,cf the operatormodule)+“uu magic_uu”方法可以明确意图,并为“用户空间”语义保留正常名称。在

wrt/英语的常规句子结构,我不得不说我真的不在乎——我学的第一门编程语言是苹果的hyperscript(后来变成了applescript),我很快发现它太冗长了。在

I could imagine there are cases where you're not sure if the object is even a proper object, rather than just None

None是一个“适当的”对象。Python中的所有内容(好吧,可以绑定到名称的所有内容)都是“正确”的对象。在

相关问题 更多 >