Найти - Пользователи
Полная версия: class without __slots__ and __dict__
Начало » Python для новичков » class without __slots__ and __dict__
1
crchemist
Переписую один сішний екстеншн на пітон, В ньому є клас 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__'
сорси класу персістент можна подивитись тут http://google.com/codesearch?hl=en&q=file:cPersistence.c+show:uNAstrjs7Yk:QNleW8ARk18:01zv1YVO6Ho&sa=N&cd=4&ct=rc&cs_p=http://www.zope.org/Products/ZODB3.3/ZODB3-3.3a2/ZODB3-3.3a2.tar.gz&cs_f=ZODB3-3.3a2/persistent/cPersistence.c
Андрей Светлов
На питоне - никак
crchemist
Андрей Светлов
You need nothing else
Тести не проходять з __slots__ ;)
Якщо додати __slots__ цей тест буде проходити:
>>> 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"
crchemist
знайшов рішення. виявляється можна так:
>>> 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
bialix
а что это вообще меняет?
crchemist
crchemist
If the object has assigned slots, then a two-element tuple is returned.
функція __getstate__ дивилась чи є __slots__ якщо вони були - повертала результат як кортеж. Якщо __slots__ були пусті поверталось таке (None, {}) якщо __slots__ не було взагалі і був тільки __dict__ повертала словник: {} якщо не було ні __dict__ ні __slots__ повертала None. В класі оголосив __slots__ - від того пропав __dict__. Потім видалив __slots__ - тепер в обєкті нема ні __slots__ ні __dict__ - __getstate__ повертає None. All tests passed ;)
Андрей Светлов
Оригинальный выкрутас. Что только не сделаешь, чтобы тесты запускались! А на самом деле все ли работает? Эти объекты нормально сериализуются? Или только тесты проходят?
crchemist
Андрей Светлов
А на самом деле все ли работает? Эти объекты нормально сериализуются?
поки шо не знаю, але тести всі проходять. Їх там багато:
persistent - 94
ZEO - 163
ZODB - 751
bialix
уж простите. не могу удержаться: да, месье знает толк в извращениях!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB