2017-02-10 10 views
3

Я хочу, чтобы иметь возможность перезаписывать класс по умолчанию при создании нового объекта int/set/str/dict/etc.Завершение (расширение) классов по умолчанию?

Пример int с:

class MyInt(int): 
    def __call__(self): 
     return self ** 2 

int = MyInt 

a = int('2') 
b = 3 
print(a) 
print(a()) 
print(int(3)()) 

print(5()) # Error -> this is what interests me to get working. 

Возможно ли это вообще?

+0

Конечно можно с AST, не знаю об остальных. – Bharel

+1

Только 5 всегда будут иметь встроенный тип 'int'. Когда вы пишете 'int = MyInt', вы не заменяете buildin' int'. Вы просто создаете локальный var. – Raz

ответ

0

Я думаю, вы должны еще раз прочитать некоторые условные обозначения для идентификаторов Python.

Python Идентификаторы:

Python, идентификатор представляет собой имя, используемое для идентификации переменной, функции, класс, модуль или другой объект. Идентификатор начинается с буквы от A до Z или от a до z или символа подчеркивания (_), за которым следует ноль или более букв, знаков подчеркивания и цифр (от 0 до 9).

Python не допускает знаков препинания, таких как @, $ и% в пределах идентификаторов. Python - это язык программирования, чувствительный к регистру. Таким образом, Manpower и рабочая сила являются двумя разными идентификаторами в Python.

Вот именования идентификаторов Python:

  • Имена классов начинаются с прописной буквы. Все остальные идентификаторы начинаются с строчной буквы.

  • Запуск идентификатора с одним лидирующим подчеркиванием означает, что идентификатор является закрытым.

  • Запуск идентификатора с двумя лидирующими символами подчеркивания означает строго частный идентификатор.

  • Если идентификатор также заканчивается двумя завершающими символами подчеркивания, идентификатор является специальным именем, определенным на языке.

Таким образом, вы код потерпит неудачу с 5(), потому что dosn't заправить Python именования/правила идентификаторов.

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

class MyInt(int): 
    def __call__(self): 
     return self ** 2 

int = MyInt 
a = int('2') 
print(a) 
print(a()) 
print(int(3)()) 
# Note here the underscore '_' 
_5 = int('3') 
print(_5) 
print(_5()) 

Выход:

2 
4 
9 
3 
9 
+1

Еще один пример: 'a = 5; a.real' работает. '5.real' не – Raz

+0

Да потому, что' 5' будет всегда встроенным типом 'int'. Поэтому интерпретатор не поймет '5.real' и выкинет исключение« SyntaxError ». –

+3

Извините за путаный комментарий. '5.real' не работает, потому что синтаксический анализатор ждет десятичную часть после точки. '(5) .real' и' 5.0.real'. – Raz

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

  • Нет связанных вопросов^_^