web-dev-qa-db-ja.com

Pythonでオブジェクトが属性を持っているかどうかを知る方法

オブジェクトに何らかの属性があるかどうかを判断するPythonの方法はありますか?例えば:

>>> a = SomeClass()
>>> a.someProperty = value
>>> a.property
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'

使用する前に、aproperty属性を持っているかどうかはどうすればわかりますか?

1344

hasattr() :を試してください。

if hasattr(a, 'property'):
    a.property

編集: zweiterlindeの答え 下を見てください、許しを求めることについての良いアドバイスを提供します!非常にピートニックなアプローチ!

Pythonの一般的なやり方は、プロパティがほとんどの場合そこにあると思われる場合は、単にそれを呼び出して例外を伝播させるか、またはtry/exceptブロックでトラップすることです。これはおそらくhasattrより速いでしょう。プロパティがほとんど存在しない可能性が高い場合、または確信が持てない場合は、hasattrを使用する方が、例外ブロックに繰り返し入るよりもおそらく高速になります。

1890
Jarret Hardie

Jarret Hardie が答えたように、hasattrがうまくいくでしょう。私は、Pythonコミュニティの多くが、「跳躍する前に見て」(LBYL)よりも「許可よりも許しを求めやすい」(EAFP)という戦略を推奨することを付け加えたいと思います。これらの参考文献を参照してください。

EAFP対LBYL(Re:これまで少し失望していた)
EAFP対LBYL @コードPythonistaのように:慣用的なPython

すなわち:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

以下が優先されます。

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()
540
zweiterlinde

hasattr()を使用することもAttributeErrorをキャッチすることもできますが、属性の値がデフォルトでない場合は、getattr()を使用することをお勧めします。

getattr(a, 'property', 'default value')
419
Carl Meyer

お探しのものは hasattr です。ただし、 pythonプロパティ - を検出する場合は、このようなものをお勧めします。

try:
    getattr(someObject, 'someProperty')         
except AttributeError:
    print "Doesn't exist"
else
    print "Exists"

ここでの不利な点は、プロパティ__get__コード内の属性エラーも捕捉されることです。

それ以外の場合は

if hasattr(someObject, 'someProp'):
    #Access someProp/ set someProp
    pass

ドキュメント: http://docs.python.org/library/functions.html
警告:
私のおすすめは、hasattrがプロパティを検出しないからです。
リンク: http://mail.python.org/pipermail/python-dev/2005-December/058498.html

36
batbrat

Pydocによると、hasattr(obj、prop)は単にgetattr(obj、prop)を呼び出して例外をキャッチします。そのため、事前にhasattr()を使用するのと同じように、属性アクセスをtryステートメントでラップしてAttributeErrorをキャッチするのと同じくらい有効です。

a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value
28
Jordan Lewis

これを避けることをお勧めします。

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

ユーザー@jpalecekはそれを述べました:AttributeErrorname__がdoStuff()の中にある場合、あなたは失われます。

たぶん、このアプローチはより良いです:

try:
    val = a.property
except AttributeError:
    otherStuff()
else:
    doStuff(val)
20
Maico

状況に応じて、isinstanceでどんな種類のオブジェクトがあるのか​​を確認してから、対応する属性を使用できます。 Python 2.6/3.0で abstract base classes が導入されたことで、このアプローチもはるかに強力になりました(基本的にABCはより洗練されたアヒルタイピング方法を可能にします)。

2つの異なるオブジェクトが同じ名前を持つが異なる意味を持つ属性を持っている場合、これが役に立つという状況が1つあります。 hasattrのみを使用すると、奇妙なエラーが発生する可能性があります。

良い例の1つは、イテレータとイテラブルの違いです( this questionを参照)。イテレータとイテラブルの__iter__メソッドは同じ名前ですが、意味的にはまったく異なります。それでhasattrは無駄ですが、isinstanceはABCと一緒にきれいな解決策を提供します。

しかし、ほとんどの場合、(他の回答で説明されている)hasattrアプローチが最も適切な解決策であることに同意します。

12
nikow

Hasattr()を期待していることを願っていますが、hasattr()を避けてgetattr()を優先してください。 getattr()はhasattr()より速い

hasattr()を使用する:

 if hasattr(a, 'property'):
     print a.property

ここでも同じプロパティがない場合はgetattrを使ってプロパティを取得します なしを返します - /

   property = getattr(a,"property",None)
    if property:
        print property
10

_ edit _ :この方法には重大な制限があります。オブジェクトが イテラブル 1であればうまくいきます。以下のコメントを確認してください。

私のように Python 3.6 またはそれ以上を使っているのであれば、オブジェクトが特定の属性を持っているかどうかを調べる便利な方法があります。

if 'attr1' in obj1:
    print("attr1 = {}".format(obj1["attr1"]))

しかし、今のところどちらが最善のアプローチかはわかりません。 hasattr()を使う、getattr()を使う、またはinを使う。コメントは大歓迎です。

9
nayak

これは非常に直感的なアプローチです。

if 'property' in dir(a):
    a.property
0
Alec Alameddine

別の可能なオプションですが、beforeで何を意味するかによって異なります。

undefined = object()

class Widget:

    def __init__(self):
        self.bar = 1

    def zoom(self):
        print("zoom!")

a = Widget()

bar = getattr(a, "bar", undefined)
if bar is not undefined:
    print("bar:%s" % (bar))

foo = getattr(a, "foo", undefined)
if foo is not undefined:
    print("foo:%s" % (foo))

zoom = getattr(a, "zoom", undefined)
if zoom is not undefined:
    zoom()

出力:

bar:1
zoom!

これにより、値のない属性をチェックすることもできます。

しかし! undefinedは決して機能しないため、isを複数の場所で誤ってインスタンス化して比較しないように注意してください。

0
JL Peyret

object組み込みメソッドを使用すると、hasattrに属性が含まれているかどうかを確認できます。

たとえば、あなたのオブジェクトがaで、属性stuffを調べたい場合

>>> class a:
...     stuff = "something"
... 
>>> hasattr(a,'stuff')
True
>>> hasattr(a,'other_stuff')
False

メソッドシグネチャ自体はhasattr(object, name) -> boolです。これはobjecthasattrの2番目の引数に渡される attribute を持つ場合、オブジェクト内のTrue属性の存在に応じてブール値のFalseまたはnameを与えることを意味します。

0
Devang Padhiyar

これは非常に簡単です、dir(を使うだけです)
これはオブジェクトの利用可能なすべての関数と属性のリストを返します。

0
Sean Christians