好的我必須在答案中輸入它,因爲它超過了註釋字符限制。正如我在評論中提到的那樣,這兩個陳述並不相同。
設置
class A(object):
def __init__(self, attr_name):
setattr(self, attr_name, 'hi')
a1 = A('my_attr')
a2 = A('other_attr')
下面是對getattr
陳述的案件。
getattr(a1, 'my_attr', None) # evaluates to 'hi'
getattr(a2, 'my_attr', None) # evaluates to None
getattr(a3, 'my_attr', None) # raises NameError
下面是三元語句的情況。
a1.my_attr if a1 else None # evaluates to 'hi'
a2.my_attr if a2 else None # raises AttributeError
a3.my_attr if a3 else None # raises NameError
第二種情況在兩種制度下是不同的。
此外,如果A
的實例評估爲False
,則兩種制度可以以不同的方式有所不同。
class A(object):
def __init__(self, attr_name):
setattr(self, attr_name, 'hi')
def __bool__(self):
return False
a1 = A('my_attr')
a2 = A('other_attr')
的getattr
報表同樣地進行評價,但三元語句現在評價如下:
a1.my_attr if a1 else None # evaluates to None
a2.my_attr if a2 else None # evaluates to None
a3.my_attr if a3 else None # raises NameError
現在第一種情況是兩種體制下的不同。
這些不是等同的陳述。第一個返回對象的字段屬性。如果field屬性不存在,則返回None。如果對象是真的,則返回對象的字段屬性。否則它返回None。 – Alex
「getattr似乎認爲一個對象確實存在,我們正在檢查該字段是否存在,這不是我們正在努力完成的任務」 - 那麼你試圖完成什麼? 'getattr'代碼對於它的目標用例非常有意義。 – user2357112
它們的返回值相同。它們將返回對象上字段的值,否則它們將返回None。假設對象具有標準的getattr方法。 – zkazanski