Как узнать, есть ли у объекта атрибут в Python

Чтобы отсортировать строки в алфавитном порядке, вам нужно будет использовать Collator, например:

 LinkedList<String> list = new LinkedList<String>();
 list.add("abc");
 list.add("Bcd");
 list.add("aAb");
 Collections.sort(list, new Comparator<String>() {
     @Override
     public int compare(String o1, String o2) {
         return Collator.getInstance().compare(o1, o2);
     }
 });

. Если вы просто вызываете Collections.sort(list), у вас будут проблемы со строками, содержащими прописные буквы.

Например, в коде, который я вставил, после сортировки список будет: [aAb, abc, Bcd], но если вы просто назовете Collections.sort(list);, вы получите: [Bcd, aAb, abc]

Примечание : при использовании Collator вы можете указать локаль Collator.getInstance(Locale.ENGLISH), это обычно довольно удобно.

1401
задан Dana 4 March 2009 в 14:56
поделиться

7 ответов

Попробуйте hasattr() :

if hasattr(a, 'property'):
    a.property

РЕДАКТИРОВАНИЕ: См. ответ zweiterlinde ниже, кто дает хороший совет о выяснении у прощения! Очень pythonic подход!

общая практика в Python - то, что, если свойство, вероятно, будет там большую часть времени, просто назовите его и или позвольте исключению распространить или захватить его с блоком попытки/кроме. Это, вероятно, будет быстрее, чем hasattr. Если свойство, вероятно, не будет там большую часть времени, или Вы не уверены, использование hasattr, вероятно, будет быстрее, чем повторное попадение в блок исключения.

2049
ответ дан Stevoisiak 5 March 2009 в 00:56
поделиться

Я думаю, что Вы ищете, hasattr. Однако я рекомендовал бы что-то вроде этого, если Вы хотите обнаружить свойства -

Python
try:
    getattr(someObject, 'someProperty')         
except AttributeError:
    print "Doesn't exist"
else
    print "Exists"

, недостаток здесь - то, что ошибки атрибута в свойствах __get__ код также фиксируются.

Иначе, сделайте -

if hasattr(someObject, 'someProp'):
    #Access someProp/ set someProp
    pass

Документы: http://docs.python.org/library/functions.html
Предупреждение:
причина моей рекомендации состоит в том, что hasattr не обнаруживает свойства.
Ссылка: http://mail.python.org/pipermail/python-dev/2005-December/058498.html

40
ответ дан batbrat 5 March 2009 в 00:56
поделиться

В зависимости от ситуации можно свериться isinstance, какой объект Вы имеете и затем используете соответствующие атрибуты. С введением абстрактные базовые классы в Python 2.6/3.0 этот подход также стал намного более мощным (в основном, ABC допускают более сложный способ утиного ввода).

Одна ситуация была, это полезно, был бы то, если два различных объекта имеют атрибут с тем же именем, но с другим значением. Используя только hasattr мог бы тогда привести к странным ошибкам.

Одним хорошим примером является различие между итераторами и iterables (см. этот вопрос). Эти __iter__ методы в итераторе и повторяемом имеют то же имя, но семантически очень отличаются! Так hasattr бесполезно, но isinstance вместе с ABC предоставляет чистое решение.

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

12
ответ дан Community 5 March 2009 в 00:56
поделиться

Можно использовать hasattr() или выгода AttributeError, но если Вы действительно просто хотите значение атрибута со значением по умолчанию, если это не там, наилучший вариант состоит в том, чтобы только использовать getattr() :

getattr(a, 'property', 'default value')
435
ответ дан Georgy 5 March 2009 в 00:56
поделиться

Как Jarret Hardie, которому отвечают, hasattr, добьется цели. Я хотел бы добавить, тем не менее, что многие в сообществе Python рекомендуют стратегию "легче попросить прощение, чем разрешение" (EAFP), а не "смотрит перед прыганием" (LBYL). Посмотрите эти ссылки:

EAFP по сравнению с LBYL (было Ре: Немного разочарованный до сих пор)
EAFP по сравнению с LBYL @Code Как Pythonista: Идиоматический Python

т.е.:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

... предпочтен:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()
575
ответ дан Gfy 5 March 2009 в 00:56
поделиться

Согласно pydoc, hasattr (obj, опора) просто называет getattr (obj, опора) и ловит исключения. Так, это столь же допустимо, чтобы обернуть доступ атрибута с оператором попытки и поймать AttributeError, как это должно использовать hasattr () заранее.

a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value
30
ответ дан Jordan Lewis 5 March 2009 в 00:56
поделиться

Другой возможный вариант, но это зависит если, под чем Вы подразумеваете прежде :

undefined = object()

class Widget:

    def __init__(self):
        self.bar = 1

    def zoom(self):
        print("zoom!")

a = Widget()

bar = getattr(a, "bar", undefined)
if bar is not undefined:
    print("bar:%s" % (bar))

foo = getattr(a, "foo", undefined)
if foo is not undefined:
    print("foo:%s" % (foo))

zoom = getattr(a, "zoom", undefined)
if zoom is not undefined:
    zoom()

вывод:

bar:1
zoom!

Это позволяет Вам даже не проверять ни на Один - оцененные атрибуты.

, Но! Будьте очень осторожны, Вы случайно не инстанцируете и выдерживаете сравнение undefined несколько мест, потому что эти is никогда не будет работать в этом случае.

0
ответ дан 22 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: