2010-12-13 6 views
0

インスタンスが持つプロパティの名前だけを取得する方法がPython(2.6)にあるかどうか疑問に思っていました。インスタンスのプロパティのみを取得する

はのは、私が持っているとしましょう:

#!/usr/bin/python2.6 

class MyClass(object): 
    def __init__(self): 
     self._x = None 

    @property 
    def x(self): 
     return self._x 

    @x.setter 
    def x(self, value): 
     print "Setting x to %s" % (value) 
     try: 
      self._x = int(value) 
     except ValueError: 
      self._x = None 



#main (test area) 
if __name__ == '__main__': 
    a = MyClass() 
    a.x = "5" 
    print str(a.x) 
    print "Vars: %s" %vars(a) 
    print "Dir: %s" %dir(a) 

出力する:

Vars: {'_x': 5} 
Dir: ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_x', 'x'] 

は "VARS" または "DIR" に似たコマンドがありますかそこらそれは私だけの "x" を与えるだろうか?

もしそうでない場合、あなたは何をすることをお勧めしますか? "vars"キーを移動し、 "_x"の前に表示される "_"を削除しますか?

ありがとうございます!

答えて

5

あなたは以下のコードを使用することができます迅速な答えを

def iter_properties_of_class(cls): 
    for varname in vars(cls): 
     value = getattr(cls, varname) 
     if isinstance(value, property): 
      yield varname 

def properties(inst): 
    result = {} 
    for cls in inst.__class__.mro(): 
     for varname in iter_properties_of_class(cls): 
      result[varname] = getattr(inst, varname) 
    return result 

>>> a = MyClass() 
>>> a.x = 5 
Setting x to 5 
>>> properties(a) 
{'x': 5} 
1

インスタンスにはプロパティがありません。彼らはdescriptorsですので、彼らはクラスで動作する必要があります。 vars(MyClass)はそれを返す必要があります。

class MyClass(object): 
    @property 
    def x(self): 
     pass 

print vars(MyClass).keys() 

プリントするだけnosklo @さんは、彼の素早さのために、投稿内容に追加

['__module__', '__dict__', 'x', '__weakref__', '__doc__'] 
+0

感謝を! さて、少なくとも私が試した例では、 "_x"を返していますが、 "x"(何とか)を得たいと思います。 – BorrajaX

+0

@BorrajaX:何ですか?いいえ、 '_x'ではなく' x'を返します。私の例を見てください。 – nosklo

+0

よろしくお願いします。私は今参照してください!ありがとうございました! – BorrajaX

1

記述子はプロパティの実装方法です。

>>> o = MyClass() 
>>> print type(o.x) 
<type 'NoneType'> 
>>> print type(MyClass.x) 
<type 'property'> 
関連する問題