Получить только свойства экземпляра - PullRequest
0 голосов
/ 13 декабря 2010

Мне было интересно, есть ли способ в 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»?

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 13 декабря 2010

Вы можете использовать следующий код:

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 голос
/ 13 декабря 2010

Просто добавляю к тому, что @ nosklo опубликовал, для его быстроты.

Дескрипторы, как реализованы свойства.

>>> o = MyClass()
>>> print type(o.x)
<type 'NoneType'>
>>> print type(MyClass.x)
<type 'property'>
1 голос
/ 13 декабря 2010

Экземпляры не имеют свойств. Это дескрипторы , поэтому они должны быть в классе , чтобы работать. vars(MyClass) должен вернуть его.

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

print vars(MyClass).keys()

печать

['__module__', '__dict__', 'x', '__weakref__', '__doc__']
...