Уведомления

Группа в Telegram: @pythonsu

#1 Июль 9, 2008 17:37:18

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

class without __slots__ and __dict__

Переписую один сішний екстеншн на пітон, В ньому є клас 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



Отредактировано (Июль 9, 2008 17:47:30)

Офлайн

#2 Июль 9, 2008 18:36:36

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

class without __slots__ and __dict__

На питоне - никак



Офлайн

#3 Июль 9, 2008 18:39:01

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

class without __slots__ and __dict__

Андрей Светлов
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"



Отредактировано (Июль 9, 2008 18:51:09)

Офлайн

#4 Июль 9, 2008 19:08:07

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

class without __slots__ and __dict__

знайшов рішення. виявляється можна так:

>>> 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



Офлайн

#5 Июль 9, 2008 20:09:50

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

class without __slots__ and __dict__

а что это вообще меняет?



Офлайн

#6 Июль 9, 2008 20:22:56

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

class without __slots__ and __dict__

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 ;)



Отредактировано (Июль 9, 2008 20:23:48)

Офлайн

#7 Июль 9, 2008 21:36:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

class without __slots__ and __dict__

Оригинальный выкрутас. Что только не сделаешь, чтобы тесты запускались! А на самом деле все ли работает? Эти объекты нормально сериализуются? Или только тесты проходят?



Офлайн

#8 Июль 9, 2008 21:55:16

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

class without __slots__ and __dict__

Андрей Светлов
А на самом деле все ли работает? Эти объекты нормально сериализуются?
поки шо не знаю, але тести всі проходять. Їх там багато:
persistent - 94
ZEO - 163
ZODB - 751



Офлайн

#9 Июль 9, 2008 22:22:53

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

class without __slots__ and __dict__

уж простите. не могу удержаться: да, месье знает толк в извращениях!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version