2015-11-08 2 views
2

(Это не про атомное испытание и установить)Можно ли добавить test & set, test & clear в класс bool?

Все, что я хочу, чтобы иметь возможность писать код так:

need_cleanup = True 
... 
if need_cleanup.test_and_clear(): 
    cleanup() 

вместо:

if need_cleanup: 
    cleanup() 
    need_cleanup = False 

ИМХО это делает не сломайте ничего в классе bool.

Попытки добавить метод закончилась:

TypeError: can't set attributes of built-in/extension type 'bool'

Это, вероятно, связано с известным ограничением, что класс BOOL не может быть наследнике, но я не хочу его подкласса.

Есть ли способ вокруг него?


EDIT: Я думаю, что у меня есть ответ. Это невозможно, потому что bool - неизменный. Переключение с False на True (или наоборот) заменяет объект bool на новый, который идентичен константе True или False соответственно. Очевидно, что вызов метода не может этого сделать. Запретное подклассирование просто отвлекало мое внимание ...

ответ

0

Вы не можете.

I thought about this last night, and realized that you shouldn't be allowed to subclass bool at all! A subclass would only be useful when it has instances, but the mere existance of an instance of a subclass of bool would break the invariant that True and False are the only instances of bool! (An instance of a subclass of C is also an instance of C.) I think it's important not to provide a backdoor to create additional bool instances, so I think bool should not be subclassable. - Guido van Rossum

Короче говоря, вы не можете добавлять атрибуты примитивов, но вы можете унаследовать их (кроме случаев, когда вы не можете).