Тестирование на наличие поля в классе - PullRequest
13 голосов
/ 20 апреля 2010

У меня быстрый вопрос. У меня есть 2D-массив, который хранит экземпляр класса. Элементам массива назначается определенный класс на основе текстового файла, который ранее читался в программе. Поскольку я не знаю, не заглядывая в файл, какой класс хранится в конкретном элементе, я мог бы сослаться на поле, которое не существует по этому индексу (имеется в виду внешний вид, когда в этом индексе хранится экземпляр temp). я придумала метод проверки этого, но он давно сложен и требует второй матрицы. Есть ли функция для проверки наличия поля в классе?

class temp():
   name = "default"

class temp1():
   appearance = "@"

Ответы [ 3 ]

33 голосов
/ 20 апреля 2010

hasattr(x, 'foo') - это встроенная двоичная функция, которая проверяет, имеет ли объект x атрибут x.foo (получает ли он его из своего класса или нет), что кажется близким к тому, что вы спрашиваете. Является ли то, что вы спрашиваете, на самом деле тем, о чем вы должны спрашивать, - это другая проблема - как подсказывает ответ @ Eli, ваш дизайн кажется странным. Тем не менее, это действительно отвечает на ваш вопрос, как и было задано; -).

3 голосов
/ 20 апреля 2010

Вы ищете:

isinstance (объект, classinfo)

Return истина, если аргумент объекта является экземпляр аргумента classinfo, или (прямого или косвенного) подкласса его. Также верните true, если classinfo является объектом типа (класс нового стиля) и объект является объектом этого типа или (прямой или косвенный) подкласс его. Если объект не является классом экземпляр или объект данного тип, функция всегда возвращает ложный. Если classinfo не является ни классом объект или тип объекта, это может быть кортеж объектов класса или типа, или может рекурсивно содержать другие такие кортежи (другие типы последовательности не принято). Если classinfo не является класс, тип или кортеж классов, типы и такие кортежи, TypeError исключение повышено.

Все, что вы пытаетесь сделать, не кажется хорошей идеей. Пожалуйста, опишите вашу первоначальную потребность более подробно, и мы поможем вам придумать лучший дизайн.

2 голосов
/ 20 апреля 2010

Вы также можете использовать обработку исключений.

try:
    val = x.name
except AttributeError:
    val = x.appearance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...