Я видел два разных объекта Python, используемых для группировки произвольных данных: пустые классы и функции.Почему пустые классы и функции Python работают как произвольные контейнеры данных, но не другие объекты?
def struct():
pass
record = struct
record.number = 3
record.name = "Zoe"
class Struct:
pass
record = Struct()
record.number = 3
record.name = "Zoe"
Даже если класс не пуст, он работает, пока он определен во время выполнения.
Но когда я стал дерзким и пытался сделать это со встроенными функциями или классами, это не сработало.
record = set()
record.number = 3
AttributeError: 'set' object has no attribute 'number'
record = pow
pow.number = 3
AttributeError: 'builtin_function_or_method' object has no attribute 'number'
Существует ли принципиальное различие между встроенными и «настраиваемыми» классами и функциями, которые учитывают это поведение?
Там ошибка в первом примере: он должен быть 'запись = struct' withouth'() ', иначе 'record' будет' None', а следующая строка выдает исключение. Кроме того, следует отметить, что использование функций работает только потому, что пользовательская функция является всего лишь еще одним объектом в python, то есть вы можете назначить произвольные атрибуты. Если функция пуста или нет, она тоже не имеет к ней никакого отношения. Но, хотя вы, вероятно, можете использовать это для какой-то напуганной магии мета-динамического программирования, я не могу придумать, почему использование функции в качестве контейнера хранения было бы предпочтительнее над классом ... – l4mpi
@ l4mpi Я думаю, что это полезно, если вы хотите эмулировать замыкания, которые «пишут» в их охватывающую область в Python 2.x перед «nonlocal». Вместо локальных варов используются специальные атрибуты локального объекта функции. – millimoose
Ой, вы правы в первом примере. –