Как создать объект python, где каждый атрибут равен None

Я не уверен, что это можно сделать, но мне нужен объект, в котором вы можете запросить любой атрибут, и он просто возвращает None вместо ошибки.

например.

>>> print(MyObject.whatever)
None
>>> print(MyObject.abc)
None
>>> print(MyObject.thisisarandomphrase)
None

без ручного назначения всех этих значений в функции __init__ объекта

Из любопытства, не могли бы вы рассказать нам, почему вы хотите это сделать?

Stuart 16.03.2022 17:19

Я создаю электронную таблицу и хочу, чтобы ячейки были пустыми, если атрибут не существует в этом конкретном объекте.

aloea 16.03.2022 17:23

Тогда я бы предположил, что вы все еще хотите, чтобы он возвращал атрибут, если атрибут существует?

Stuart 16.03.2022 17:30

ответ - нет по сложным причинам, но ваш ответ будет полезен кому-то еще, так что все равно спасибо :)

aloea 16.03.2022 17:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
35
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете определить __getattribute__:

class MyObject:
    def __getattribute__(self, name):
        return None  # or simply return
    
x = MyObject()
print(x.abc)
print(x.xyz)

выход:

None
None

NB. обратите внимание, что это может работать не со всеми атрибутами, есть зарезервированные слова, например. x.class

Не уверен, понял ли я ваш вопрос (не очень хорошо говорит по-английски), но я думаю, вы могли бы попробовать использовать hasattr (https://docs.python.org/3/library/functions.html#hasattr), чтобы проверить, существует ли атрибут, и вернуть все, что вы хотите, если это не так.

Если вы все еще хотите, чтобы класс возвращал фактические атрибуты, когда они существуют, у вас могут быть __getattribute__ ошибки атрибута catch:

class MyObject(object):
    def __getattribute__(self, name):
        try:
            return object.__getattribute__(self, name)
        except AttributeError:
            return None

Я бы предположил, что если атрибут действительно существует, вам нужно его значение, поэтому я предлагаю:

class MyClass:
    def __init__(self):
        self.a = 1
    def __getattr__(self, name):
        try:
            return super(MyClass, self).__getattr__(name)
        except AttributeError:
            pass
        return None

mc = MyClass()

print(mc.a)
print(mc.b)

Выход:

1
None

Другие вопросы по теме