Форум сайта python.su
Переписую один сішний екстеншн на пітон, В ньому є клас Persistent. Цей клас не має __dict__ і не має __slots__ як на пітоні можна написати клас, екземпляри якого не будуть мати __dict__ , при тому не використовувати __slots__.
>>> from persistent import Persistent >>> class D(object): ... """ ... """ ... >>> class S(object): ... __slots__ = ['a'] ... >>> D.__dictoffset__ 8 >>> S.__dictoffset__ 0 >>> Persistent.__dictoffset__ 0 >>> S.__slots__ ['a'] >>> Persistent.__slots__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: type object 'persistent.Persistent' has no attribute '__slots__'
Отредактировано (Июль 9, 2008 17:47:30)
Офлайн
На питоне - никак
Офлайн
Андрей СветловТести не проходять з __slots__ ;)
You need nothing else
>>> x = Persistent() >>> x.bar = 1 Traceback (most recent call last): ... AttributeError: 'Persistent' object has no attribute 'bar'
>>> x = Persistent()
>>> print x.__getstate__()
None
"If the object has assigned slots, then a two-element tuple is returned. \n"
"The first element is either None or a copy of the instance dictionary, \n"
"The second element is a dictionary with items \n"
"for each of the assigned slots.\n"
Отредактировано (Июль 9, 2008 18:51:09)
Офлайн
знайшов рішення. виявляється можна так:
>>> class A(object): ... __slots__ = ['a'] ... >>> del A.__slots__ >>> A.__slots__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: type object 'A' has no attribute '__slots__' >>> obj = A() >>> obj.a = 10 >>> obj.b = 15 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'A' object has no attribute 'b' >>> A.__dictoffset__ 0
Офлайн
а что это вообще меняет?
Офлайн
crchemistфункція __getstate__ дивилась чи є __slots__ якщо вони були - повертала результат як кортеж. Якщо __slots__ були пусті поверталось таке (None, {}) якщо __slots__ не було взагалі і був тільки __dict__ повертала словник: {} якщо не було ні __dict__ ні __slots__ повертала None. В класі оголосив __slots__ - від того пропав __dict__. Потім видалив __slots__ - тепер в обєкті нема ні __slots__ ні __dict__ - __getstate__ повертає None. All tests passed ;)
If the object has assigned slots, then a two-element tuple is returned.
Отредактировано (Июль 9, 2008 20:23:48)
Офлайн
Оригинальный выкрутас. Что только не сделаешь, чтобы тесты запускались! А на самом деле все ли работает? Эти объекты нормально сериализуются? Или только тесты проходят?
Офлайн
Андрей Светловпоки шо не знаю, але тести всі проходять. Їх там багато:
А на самом деле все ли работает? Эти объекты нормально сериализуются?
Офлайн
уж простите. не могу удержаться: да, месье знает толк в извращениях!
Офлайн