当您需要在Python中动态访问对象的属性时,您只需使用内置函数hasattr(object, attribute)
或{
然而,对于语法来说,这似乎是一个奇怪的顺序。它的可读性和直观性较差,因为它扰乱了英语的常规句子结构。
if hasattr(person, age):
if has attribute Person age
如果把它作为对象的一种方法会更具可读性:
if person.hasattr(age):
if Person has attribute age
不这样做有什么特别的原因吗?我可以想象在某些情况下,你不确定这个对象是否是一个合适的对象,而不仅仅是None
,但是在那些不确定的情况下,为了额外的安全,你可以使用内置函数。
有没有其他一些我没有想到的缺点或考虑,使添加这些不值得吗?
它是语言设计的一部分。我猜你找到了一些关于它背后更复杂思想的文档,但是关键点是
getattr
函数作用于对象,而不是对象的一部分。在__getattr__
,您可以在对象上找到这个函数;-)。getattr在内部使用它,所以你甚至可以覆盖它(如果你知道你在做什么)。在你会发现很多类似的例子-比如用},}。您可能还注意到加法的拼写是}等等。。。关键是一些内置的“函数”被视为运算符而不是真正的函数,并且由“u magic_uu”方法(
len(obj)
代替obj.length()
,hash(obj)
而不是{isinstance(obj, cls)
而不是{obj1 + obj2
而不是obj1.add(obj2)
,减法拼写为obj1 - obj2
而不是{__len__
,__hash__
,__add__
等)支持。在至于“为什么”,你不得不问GvR,但历史原因是,它至少避免了很多名称空间污染/名称冲突。如果}是一个类似于序列的对象?在
length
已经是一个“某种类型但不是明确保留”的名称,那么如何命名“Line”或“Rectangle”类的长度?内省应该如何理解Rectangle.length()
并不意味着{使用泛型“operator”函数(注意,适当的运算符也作为函数存在,cf the
operator
module)+“uu magic_uu”方法可以明确意图,并为“用户空间”语义保留正常名称。在wrt/英语的常规句子结构,我不得不说我真的不在乎——我学的第一门编程语言是苹果的hyperscript(后来变成了applescript),我很快发现它太冗长了。在
None
是一个“适当的”对象。Python中的所有内容(好吧,可以绑定到名称的所有内容)都是“正确”的对象。在相关问题 更多 >
编程相关推荐