Перечисление атрибутов объекта, отфильтрованных по типу дескриптора - PullRequest
2 голосов
/ 12 апреля 2019

Я хотел бы использовать собственный дескриптор для проверки и (де) сериализации, например так:

class MyProperty():
  def __init__ (self, **kwargs):
    self.value = None

  def __get__ (self, obj, owner_class):
    return self.value

class MyClass():
  foo = MyProperty()
  bar = MyProperty()

  def __init__(self):
    self.baz = True

  def list_my_properties(self):
    pass # TODO

Я не могу написать list_my_properties, чтобы он возвращал все свойства, которые были объявлены как MyProperty (например, foo и bar), но не другие (например, baz).После прочтения Итерации по атрибутам объекта в python , это то, что я пробовал до сих пор:

for a, v in self.__dict__.items():
  print(a, isinstance(v, MyProperty))
# [no output]

for a in dir(self):
  print(a, isinstance(getattr(self, a), MyProperty))
# foo False
# bar False
# baz False

Как мне перечислить атрибуты объекта, отфильтрованные по типу дескриптора?

Обновление:

На основании принятого ответа (спасибо!) Я получил следующее:

def list_my_properties (self):
    return [ field for field, value in self.__class__.__dict__.items()
            if isinstance(value, MyProperty) ]

1 Ответ

1 голос
/ 12 апреля 2019

foo и bar определены как переменные класса, поэтому вы не найдете их в __dict__ экземпляра, а скорее в __dict__:

класса экземпляра.
for a, v in self.__class__.__dict__.items():
    if isinstance(v, MyProperty):
        print(a)

Это выводит:

foo
bar
...