2009-04-26 2 views

ответ

8

В атрибутах Python реализованы с использованием словаря:

>>> t = test() 
>>> t.__dict__["foo"] = "bla" 
>>> t.foo 
'bla' 

Но для "объекта", он использует 'dictproxy' в качестве интерфейса для предотвращения такого присваивания:

>>> object.__dict__["test"] = "test" 
TypeError: 'dictproxy' object does not support item assignment 

Так что нет, вы не можете.

NB: вы не можете изменять тип метакласса напрямую. Но поскольку Python очень гибкий, я уверен, что Гуру может найти способ достичь того, чего вы хотите. Любой черный волшебник здесь :-)?

+0

Может быть, через метаклассы? –

+4

Нет, метаклассы будут влиять только на классы и объекты, которые их используют, а не на существующие встроенные типы, такие как объект, int, str, float и т. Д. Итак, «все объекты» просто не произойдет. (Вы можете вставлять новые функции в __builtin__, конечно, что сделает их такими же доступными, но они не будут МЕТОДОМ объекта встроенного типа). –

0
 
>>> object.test = "Test" 
Traceback (most recent call last): 
    File "", line 1, in 
TypeError: can't set attributes of built-in/extension type 'object' 

Не похоже. (Python 2.5.1)

+0

, так что ответ НЕТ?)) –

+0

Я так думаю, но я не уверен на 100%. –

5

Нет, внутренности Python очень заботятся о том, чтобы встроенные типы НЕ изменялись - очень разные варианты дизайна от Ruby's. Невозможно сделать объект «monkeypatchable» без глубокого проникновения в C-кодированные внутренние компоненты и перекомпилировать среду исполнения Python, чтобы сделать совсем другую версию (это для классического CPython, но я считаю, что тот же принцип справедлив для других хороших реализаций, таких как как Jython и IronPython, просто s/C/Java/и S/C/C#/соответственно ;-).

Смежные вопросы