gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:07:56 26 4
gpt4 key购买 nike

当您需要在 Python 中动态访问对象的属性时,您可以使用内置函数 hasattr(object, attribute)getattr(object, attribute)

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

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

将它作为对象的方法将更具可读性:

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

是否有特殊原因不以这种方式实现?我可以想象在某些情况下您不确定该对象是否是一个合适的对象,而不仅仅是 None,但在这些不确定的情况下您肯定可以使用内置函数来获得额外的安全。

是否有其他一些我没有想到的缺点或考虑因素使得添加这些不值得?

最佳答案

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

至于“为什么”,您必须询问 GvR,但撇开历史原因不谈,它至少避免了很多 namespace 污染/名称冲突。如果 length 已经是“某种但未明确保留”的名称,您将如何命名“Line”或“Rectangle”类的长度?内省(introspection)应该如何理解 Rectangle.length() 并不意味着 Rectangle 是一个相当大的类似序列的对象?

使用通用的“运算符”函数(注意适当的运算符也作为函数存在,参见 operator 模块)+“__magic__”方法使意图明确并为“用户空间”保留正常名称语义。

关于“英语的常规句子结构”,我不得不说我真的不在乎 - 我学习的第一种编程语言是 Apple 的 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

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

关于python - 为什么对象没有 hasattr 和 getattr 作为属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39980030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com