Возможно ли перебирать * значения * элементов dir()?

#python

#python

Вопрос:

Я пытаюсь сделать что-то вроде этого:

 class random_class():

    def __init__(self, color):
        self.color = color

    def iterate(self):
        for item in dir(self):
            print (self.item)

instance = random_class("blue")

random_class.iterate(instance)
 

Но если я это сделаю, я получу:

 AttributeError: 'random_class' object has no attribute 'item'
 

Это означает, что он ищет атрибут, указанный item в экземпляре

Комментарии:

1. Просто печатайте item , а не self.item .

2. @martineau но если я это сделаю, я получу имена атрибутов (например __subclasshook__ __weakref__ color iterate ) То, что я пытаюсь сделать, это получить значение, например, как только оно становится цветным, оно должно печататься blue

3. qwerty_url: Я считаю, что вам следовало адресовать свой комментарий @John Gordon.

4. Да, я новичок в этом, и я также понял, что должен был привести пример того, какой результат я пытался получить в своем сообщении, извините и спасибо всем за помощь.

5. не используйте dir для этого, используйте vars . dir не должен использоваться ни для чего, кроме отладки

Ответ №1:

Если вы пытаетесь получить свойства, вы бы отбросили ключевое слово self, поскольку оно не требуется, поскольку вы уже извлекаете значение из dir .

Однако, если вам нужно фактическое значение, вы можете использовать getattr его для получения значения в своем цикле.

 class random_class():

def __init__(self, color):
    self.color = color

def iterate(self):
    for item in dir(self):
        print (getattr(self, item))

instance = random_class("blue")

random_class.iterate(instance)
 

Это приведет к удалению связанного значения с этим свойством вашего объекта.

Редактировать

Обратите внимание, что приведенное выше будет включать встроенные методы в классе. Если вы этого не хотите, просто игнорируйте элементы, начинающиеся с __

 class random_class():

def __init__(self, color):
    self.color = color

def iterate(self):
    for item in dir(self):
        if not item.startswith('__'):
            print (getattr(self, item))

instance = random_class("blue")

random_class.iterate(instance)
 

Ответ №2:

item ссылается на переменную, определенную циклом, а не на атрибут объекта. Так что просто замените print(self.item) на print(item) .

Ответ №3:

item ссылается на переменную в цикле, а не на атрибут объекта. Таким образом, вы можете просто распечатать item и удалить self. .

Код:

 print(item)
 

Ответ №4:

Поскольку item не является атрибутом random_class , вы можете просто распечатать item вместо self.item:

 class random_class():

    def __init__(self, color):
        self.color = color

    def iterate(self):
        for item in dir(self):
            print (item)

instance = random_class("blue")

random_class.iterate(instance)