Рубрики
Без рубрики

Как получить список атрибутов классов в Python

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

На днях я пытался выяснить, был ли простой способ захватить определенные атрибуты класса (AKA »переменных экземпляров«). Причина заключалась в том, что мы использовали атрибуты, которые мы создали, чтобы сопоставить с полями в файле, который мы разбираем. Таким образом, мы прочитаем файловую строку, и каждая строка может быть разделена на 150+ штук, которые необходимо сопоставлять на поля, которые мы создаем в классе. Улов в том, что мы недавно добавили больше полей в класс, и есть чек в коде, который жестко закодирован с количеством полей, которые должны быть в файле. Таким образом, когда я добавил больше полей, он сломал чек. Я надеюсь, что все имеет смысл. Теперь вы знаете фон, поэтому мы можем двигаться дальше. Я нашел три разных способа достичь этого, поэтому мы отправимся от самого сложного до самой простой.

Поскольку большинство программистов Python должны знать, Python предоставляет удобный маленький встроенный встроенный Дир Отказ Я могу использовать это в экземпляре класса, чтобы получить список всех атрибутов и методов этого класса вместе с некоторыми унаследованными методами магии, таких как «__delattr__», ‘__dict__’, ‘__doc__’, ‘__Format__’ и т. Д. Вы можете Попробуйте это сами, делая следующее:

x = dir(myClassInstance)

Однако я не хочу, чтобы магические методы, и я тоже не хочу методы. Я просто хочу атрибуты. Чтобы сделать все кристально чистые, давайте напишем какой-нибудь код!

########################################################################
class Test:
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        self.varOne = ""
        self.varTwo = ""
        self.varThree = ""
        
    #----------------------------------------------------------------------
    def methodOne(self):
        """"""
        print "You just called methodOne!"

#----------------------------------------------------------------------            
if __name__ == "__main__":
    t = Test()

То, что мы хотим получить, это список, который содержит только Self.varone, Self.Vartwo и Self.varthree. Первый метод, на котором мы рассмотрим, является использование модуля проверки Python.

import inspect
variables = [i for i in dir(t) if not inspect.ismethod(i)]

Не выглядит слишком сложным, не делает это? Но это требует импорта, и я бы предпочел этого не делать. С другой стороны, если вам нужно сделать самоанализ, модуль проверки – отличный способ пойти. Это довольно мощно и может сказать вам много замечательных вещей о вашем классе или один, который вы даже не писали. Во всяком случае, следующий самый простой способ, которым я обнаружил, было использовать Python’s Callable Встроенный:

variables = [i for i in dir(t) if not callable(i)]

Вы можете прочитать больше о Callable в Python Документы Отказ В основном все, что Callable – возвращает истинный или ложный в зависимости от того, приоритет ли вы, который вы передали его. Методы Callable, переменные нет. Таким образом, мы связываемся над каждым элементом в классе Dict и только добавляем их к списку, если они не Callable (то есть не методы). Довольно Slick, и это не требует никакого импорта! Но есть еще проще!

Самый простой способ, которым я нашел, использовал магический метод, __dict__ Отказ Это встроено в каждый класс, который вы делаете, если вы не переопределите его. Поскольку мы имеем дело с словарем Python, мы можем просто называть его Ключи Способ!

variables = t.__dict__.keys()

Настоящий вопрос сейчас, если вы используете магический метод для этого? Большинство Python Programmer, вероятно, нахмурится на него. Они волшебные, поэтому они не должны использоваться, если вы не делаете MetaProgramming. Лично я думаю, что это совершенно приемлемо для этого случая использования. Дайте мне знать о любых других методах, которые я пропустил или что, по вашему мнению, лучше.

Ресурсы