это называется «побочные эффекты несовместимой файловой системы с коммиттером задания, который зависит от согласованных списков каталогов для переименования работы в место»
Исправления
Обновление: в данном конкретном случае это не так, поскольку Ceph - это FS, и он непротиворечив.
Когда вы объявляете переменные экземпляра, используя __ slots __
, Python создает объект дескриптора как переменную класса с тем же именем. В вашем случае этот дескриптор перезаписывается переменной класса m
, которую вы определяете в следующей строке:
m = None # my attribute
Вот что вам нужно сделать: Не определяйте переменную класса с именем m
и инициализировать переменную экземпляра m
в методе __ init __
.
class MyClass(object):
__slots__ = ("m",)
def __init__(self):
self.m = None
a = MyClass()
a.m = "?"
В качестве примечания, кортежам с отдельными элементами нужна запятая после элемента. Оба работают в вашем коде, потому что __ slots __
принимает одну строку или итерируемую / последовательность строк. В общем, для определения кортежа, содержащего элемент 1
, используйте (1,)
или 1,
Вы неправильно используете ___ слотов __
. Он предотвращает создание __ dict __
для экземпляров. Это имеет смысл только в том случае, если вы столкнетесь с проблемами памяти со многими небольшими объектами, потому что избавление от __ dict __
может уменьшить занимаемую площадь. Это жесткая оптимизация, которая не требуется в 99,9% всех случаев.
Если вам нужна описанная вами безопасность, то Python действительно не тот язык. Лучше использовать что-то строгое, например, Java (вместо того, чтобы пытаться писать Java на Python).
Если вы не могли сами понять, почему атрибуты класса вызвали такие проблемы в вашем коде, то, возможно, вам следует дважды подумать о введении языковых хаков, подобных этому , Вероятно, было бы разумнее сначала лучше ознакомиться с языком.
Просто для полноты,
__ slots __
работает с переменными экземпляра, тогда как у вас есть переменная класса. Вот как вы должны это делать:
class MyClass( object ) :
__slots__ = ( "m", )
def __init__(self):
self.m = None
a = MyClass()
a.m = "?" # No error
Подумайте об этом.
class SuperSafe( object ):
allowed= ( "this", "that" )
def __init__( self ):
self.this= None
self.that= None
def __setattr__( self, attr, value ):
if attr not in self.allowed:
raise Exception( "No such attribute: %s" % (attr,) )
super( SuperSafe, self ).__setattr__( attr, value )
Лучше использовать модульные тесты для такого рода проверки. Это изрядные накладные расходы времени выполнения.