Я хочу получить атрибуты класса, например:
class MyClass():
a = "12"
b = "34"
def myfunc(self):
return self.a
using MyClass.__dict__
дает мне список атрибутов и функций и даже таких функций, как __module__
и __doc__
. В то время как MyClass().__dict__
дает мне пустой словарь, если я явно не установил значение атрибута этого экземпляра.
Мне просто нужны атрибуты, в приведенном выше примере это будут: a
иb
python
python-2.7
class
attributes
Мохамед Хамис
источник
источник
Ответы:
Попробуйте модуль проверки .
getmembers
и различные тесты должны быть полезны.РЕДАКТИРОВАТЬ:
Например,
Теперь специальные методы и атрибуты действуют мне на нервы - с ними можно справиться разными способами, самый простой из которых - просто фильтровать по имени.
... и более сложные из которых могут включать специальные проверки имен атрибутов или даже метаклассы;)
источник
attributes = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
print [a[0] for a in attributes if '_' not in a[0]]
like_this
! Это также позволит избежать «частных» атрибутов, которые вы могли сделать специально.inspect.getmembers(MyClass, ...
,MyClass
может быть заменена классом или объектом, и если вам нужен список значений ваших объектов, вы должны заменитьMyClass
на переменном объект (или ,self
если вы поставите это выражение в такомdef __repr__()
методе, как я).i = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a))); z = [_[1] for _ in i if _[0] in '__dict__'][0]
а затем просто получить ключи от z.источник
if not i.startswith('_')
вместоif i[:1] != '_'
?.__dict__.keys()
не будем включать атрибуты от родительского.myfunc
является атрибутомMyClass
. Вот как это обнаруживается при беге:Он ищет атрибут в
myinstance
namedmyfunc
, не находит его, видит, чтоmyinstance
это экземплярMyClass
и ищет его там.Итак, полный список атрибутов для
MyClass
:(Обратите внимание, что я использую dir просто как быстрый и простой способ перечислить члены класса: его следует использовать только в исследовательском режиме, а не в производственном коде)
Если вы хотите только определенные атрибуты, вам нужно отфильтровать этот список , используя некоторые критерии, потому что
__doc__
,__module__
иmyfunc
не являются особенными в любом случае, они атрибуты точно так же, какa
иb
есть.Я никогда не использовал модуль проверки, упомянутый Мэттом и Бореалидом, но, судя по краткой ссылке, похоже, что в нем есть тесты, которые помогут вам в этом, но вам нужно будет написать свою собственную функцию предиката, так как это кажется тем, что вы хотите это примерно атрибуты, которые не проходят
isroutine
проверку и не начинаются и не заканчиваются двумя символами подчеркивания.Также обратите внимание: при использовании
class MyClass():
в Python 2.7 вы используете сильно устаревшие классы старого стиля. Если вы не делаете это специально для совместимости с очень старыми библиотеками, вам следует вместо этого определить свой класс какclass MyClass(object):
. В Python 3 нет классов «старого стиля», и это поведение используется по умолчанию. Однако использование классов newstyle даст вам гораздо больше автоматически определенных атрибутов:источник
dir()
: " Поскольку dir () предоставляется в первую очередь для удобства использования в интерактивном приглашении, он пытается предоставить интересный набор имен больше, чем он пытается предоставить строго или последовательно определенный набор имен , а его подробный поведение может измениться в зависимости от выпуска . "(см. документациюdir()
).Получить только атрибуты экземпляра легко.
Но получение также атрибутов класса без функций немного сложнее.
Только атрибуты экземпляра
Если вам нужно только перечислить атрибуты экземпляра, просто используйте
for attribute, value in my_instance
.__dict__
.items()
Атрибуты экземпляра и класса
Чтобы получить также атрибуты класса без функций, нужно использовать
callable()
.Но статические методы есть не всегда
callable
!Поэтому вместо использования
callable(value)
используйтеcallable
(getattr
(MyClass, attribute))
пример
Примечание:
print_class_attributes()
должно быть но не в этом глупом и простом@staticmethod
примере.
Результат для python2
Тот же результат для python3
источник
MyClass().__class__.__dict__
Однако «правильным» было сделать это через модуль проверки .
источник
MyClass().__class__.__dict__
==MyClass.__dict__
MyClass().__class__.__dict__ != MyClass().__dict__
, но yak не включает скобки с правой стороны, в случае чего он / она правДля экземпляра MyClass, например
использовать
type(mc)
вместоMyClass
понимания списка. Однако, если кто-то динамически добавляет атрибутmc
, напримерmc.c = "42"
, атрибут не будет отображаться при использованииtype(mc)
в этой стратегии. Он дает только атрибуты исходного класса.Чтобы получить полный словарь для экземпляра класса, вам нужно ОБЪЕДИНЯТЬ словари
type(mc).__dict__
иmc.__dict__
.источник
Я не знаю, было ли сделано что-то подобное к настоящему времени или нет, но я сделал красивую функцию поиска атрибутов с помощью vars (). vars () создает словарь атрибутов класса, через который вы проходите.
Я разрабатываю довольно масштабное текстовое приключение на Python, мой класс Player пока имеет более 100 атрибутов. Я использую это для поиска определенных атрибутов, которые мне нужно увидеть.
источник
Думаю, это можно сделать и без проверки.
Возьмите следующий класс:
Глядя на участников вместе с их типами:
... дает:
Итак, чтобы вывести только переменные, вам просто нужно отфильтровать результаты по типу и именам, не начинающимся с '__'. Например
Вот и все.
Примечание: если вы используете Python 3, преобразуйте итераторы в списки.
Если вам нужен более надежный способ сделать это, используйте inspect .
источник
Python 2 и 3, без импорта, фильтрация объектов по их адресу
Кратко о решениях:
Вернуть dict {attribute_name: attribute_value} , объекты отфильтрованы. т.е.
{'a': 1, 'b': (2, 2), 'c': [3, 3]}
Список возврата [attribute_names] , объекты отфильтрованы. т.е.
['a', 'b', 'c', 'd']
Список возврата [attribute_values] , объекты отфильтрованы. т.е.
[1, (2, 2), [3, 3], {4: 4}]
Не фильтровать объекты
Удаление
if
состояния. Возвращение{'a': 1, 'c': [3, 3], 'b': (2, 2), 'e': <function <lambda> at 0x7fc8a870fd70>, 'd': {4: 4}, 'f': <object object at 0x7fc8abe130e0>}
Решение в долгом
До тех пор , как реализация по умолчанию
__repr__
не переопределяетсяif
заявление будет возвращать ,True
если шестнадцатеричное представление места в памятиval
находится в__repr__
обратном строке.Что касается реализации по умолчанию,
__repr__
вы можете найти полезную этот ответ . Коротко:Что возвращает строку вроде:
Расположение в памяти каждого элемента получается через
id()
метода.Документы Python говорится об id ():
Попробуй сам
Вывод:
Примечание :
Протестировано на Python
2.7.13
и Python3.5.3
В Python 2.x
.iteritems()
предпочтительнее.items()
источник
Мне недавно нужно было выяснить что-то похожее на этот вопрос, поэтому я хотел опубликовать некоторую справочную информацию, которая может быть полезна другим, столкнувшимся с тем же в будущем.
Вот как это работает в Python (из https://docs.python.org/3.5/reference/datamodel.html#the-standard-type-hierarchy ):
MyClass
является объектом класса,MyClass()
является экземпляром объекта класса.__dict__
Только атрибуты и методы хранения экземпляра, относящиеся к этому экземпляру (напримерself.somethings
). Если атрибут или метод является частью класса, он находится в классе__dict__
. Когда вы это сделаетеMyClass().__dict__
, экземплярMyClass
без атрибутов или методов, кроме атрибутов класса, поэтому пустой__dict__
Итак, если вы скажете
print(MyClass().b)
, Python сначала проверяет dict нового экземпляраMyClass().__dict__['b']
и не может его найтиb
. Затем он проверяет классMyClass.__dict__['b']
и находитb
.Вот почему вам нужен
inspect
модуль для имитации того же процесса поиска.источник
Вы можете использовать
dir()
в списке понимание , чтобы получить имена атрибутов:Используйте
getattr()
для получения самих атрибутов:источник
Мое решение получить все атрибуты (не методы) класса (если у класса есть правильно написанная строка документации, в которой атрибуты четко прописаны):
Эта часть
cls.__dict__['__doc__']
извлекает строку документации класса.источник
Зачем нужно перечислять атрибуты? Кажется, что семантически ваш класс - это коллекция. В этом случае я рекомендую использовать enum:
Перечислите свои атрибуты? Нет ничего проще этого:
источник
Если вы хотите «получить» атрибут, есть очень простой ответ , который должен быть очевиден: getattr
Он отлично работает как в Python 2.7, так и в Python 3.x.
Если вам нужен список этих элементов, вам все равно нужно будет использовать inspect.
источник
две функции:
использование:
источник
Вот чего я хочу.
Данные испытаний
источник
Я знаю, что это было три года назад, но для тех, кто задаст этот вопрос в будущем, для меня:
работает нормально.
источник
attribute
есть заранее.Вы можете использовать
MyClass.__attrs__
. Он просто дает все атрибуты этого класса. Ничего более.источник