[Python-Dev] Explorations on new-style classes

Kevin Jacobs jacobs@penguin.theopalgroup.com
Wed, 6 Mar 2002 09:47:06 -0500 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--416156269-1032046193-1015426026=:8532
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Tue, 5 Mar 2002, David Abrahams wrote:
> Although I understand the appeal, using __slots__ to constrain the
> attributes might be misguided (depending on your goals):

How about something even more misguided?  I've implemented a metaclass that
works around the problem of layout conflicts.  e.g.:

  class A(object):
    __metaclass__ = LazySlotBuilder
    __slots__ = 'a'

  class B(object):
    __metaclass__ = LazySlotBuilder
    __slots__ = 'b'

  class C(B):
    __slots__ = 'c'

  class AB(A,B):
    __slots__ = ['ab']

  class ABC(A,B,C,AB):
    __slots__ = ['abc']

  abc=ABC()
  print type(abc).__slots__
  > ['a', 'c', 'b', 'ab', 'abc']


An implementation of LazySlotBuilder metaclass is attached.  It works by
creating 2 types instead of 1 if slots are present.  The first class is an
abstract version of the desired class with no slots declared in itself or
its base classes.  A concrete version is then built that inherits from the
abstract version, adding only the slot definitions and a reference to the
abstract class.

The current version has one significant limitation: it requires that all
base classes with slots have the LazySlotBuilder metaclass.  This can be
worked around, but makes the implementation needlessly complex.

I'm very much interested in what people think about these ideas about using
(or mis-using) slots, metaclasses, new-style classes, and other cutting-edge
Python features.  I am intentionally trying to push the limits and take
things beyond what some of these features were originally intended to do. 
It is my hope that such examples will educate, spur discussion and help
determine exactly which behaviors are intentional and supported, and which
are implementation artifacts that should not be taunted lightly.

I am also aware that a sizeable fraction of python-dev may not care much
about this topic, so I would not be offended if the consensus was that this
discussion is not topical enough for the list.  In that case, I would be
happy to move it elsewhere, maybe to its own mailing list.  Just keep in
mind that these features are potentially the most confusing and powerful
language extensions that Python has ever had, and that people (like myself)
are currently writing code that is beginning to make full use of them. 
There are a lot of dusty corners to explore, and it is important for the
principal Python developers to be aware of and to deal with any gremlins
hiding in them.

It would also be nice if some of the examples I'm working on could
eventually become part of the official Python test suite.  If for no other
reason, because the current set of tests is somewhat sparse.

Regards,
-Kevin

--
Kevin Jacobs
The OPAL Group - Enterprise Systems Architect
Voice: (216) 986-0710 x 19         E-mail: jacobs@theopalgroup.com
Fax:   (216) 986-0714              WWW:    http://www.theopalgroup.com

--416156269-1032046193-1015426026=:8532
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="bluesmoke.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.44.0203060947060.8532@penguin.theopalgroup.com>
Content-Description: 
Content-Disposition: attachment; filename="bluesmoke.py"

JycnDQpGaWxlOiAgICAgICAgICBibHVlc21va2UucHkNCg0KQXV0aG9yOiAg
ICAgICAgS2V2aW4gSmFjb2JzIChqYWNvYnNAdGhlb3BhbGdyb3VwLmNvbSkN
Cg0KQ3JlYXRlZDogICAgICAgTWFyY2ggNiwgMjAwMg0KDQpQdXJwb3NlOiAg
ICAgICBJbXBsZW1lbnRzIGluc2FuZSBtZXRhY2xhc3MgdHJpY2tzIGluIFB5
dGhvbg0KDQpDb21wYXRpYmlsaXR5OiBQeXRob24gMi4yDQoNClJlcXVpcmVz
OiAgICAgIA0KDQpSZXZpc2lvbjogICAgICAkSWQ6ICQNCicnJw0KDQpjbGFz
cyBMYXp5U2xvdEJ1aWxkZXIodHlwZSk6DQogIGRlZiBfX25ld19fKGNscywg
bmFtZSwgYmFzZXMsIGNsc19kaWN0KToNCiAgICB2aXNpdGVkID0ge30NCiAg
ICBzbG90cyAgID0ge30NCiAgICBuZXdfYmFzZXMgPSBbXQ0KDQogICAgZm9y
IGJhc2UgaW4gYmFzZXM6DQogICAgICAjIEdyYWIgYWJzdHJhY3QgdmVyc2lv
bnMgb2YgYWxsIG9mIG91ciBiYXNlcy4gIFRoaXMgY3VycmVudGx5IGFzc3Vt
ZXMgdGhhdA0KICAgICAgIyBhbGwgY2xhc3NlcyB3aXRoIHNsb3RzIGhhdmUg
dGhlIExhenlTbG90QnVpbGRlciBtZXRhY2xhc3MuICBJdCB3b3VsZCBub3QN
CiAgICAgICMgYmUgZGlmZmljdWx0IHRvIHJlbGF4IHRoaXMgYXNzdW1wdGlv
bi4NCiAgICAgIG5ld19iYXNlcy5hcHBlbmQoYmFzZS5fX2RpY3RfXy5nZXQo
J19fYWJzdHJhY3RfdHlwZScsYmFzZSkpDQoNCiAgICAgICMgQ29sbGVjdCBh
bGwgc2xvdHMgZnJvbSBiYXNlIGNsYXNzZXMgYXNzdW1pbmcgdGhhdCBfX3Ns
b3RzX18gaGFzIG5vdA0KICAgICAgIyBiZWVuIG1vZGlmaWVkIHNpbmNlIG9i
amVjdCBjcmVhdGlvbi4gIEJldHRlciB3YXlzIG9mIGRvaW5nIHRoaXMgYXJl
DQogICAgICAjIGNlcnRhaW5seSBwb3NzaWJsZS4NCiAgICAgIGZvciBiIGlu
IGJhc2UubXJvKCk6DQogICAgICAgIGlmIGIgaW4gdmlzaXRlZDoNCiAgICAg
ICAgICBjb250aW51ZQ0KICAgICAgICB2aXNpdGVkW2JdPTENCiAgICAgICAg
Zm9yIHNsb3QgaW4gZ2V0YXR0cihiLCdfX3Nsb3RzX18nLFtdKToNCiAgICAg
ICAgICBzbG90c1tzbG90XSA9IDENCg0KICAgICMgQ29sbGVjdCB0aGUgc2xv
dHMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIHRvIGJlIGNyZWF0ZWQNCiAgICBp
ZiAnX19zbG90c19fJyBpbiBjbHNfZGljdDoNCiAgICAgIGZvciBzbG90IGlu
IGNsc19kaWN0WydfX3Nsb3RzX18nXToNCiAgICAgICAgc2xvdHNbc2xvdF0g
PSAxDQoNCiAgICAjIElmIG5vIHNsb3RzIHdlcmUgZm91bmQsIHRoZW4gYnVp
bGQgdGhlIG5vcm1hbCBib3JpbmcgY2xhc3MNCiAgICBpZiBub3Qgc2xvdHM6
DQogICAgICByZXR1cm4gc3VwZXIoTGF6eVNsb3RCdWlsZGVyLGNscykuX19u
ZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBjbHNfZGljdCkNCg0KICAgICMgSWYg
d2UgaGF2ZSBhbnkgc2xvdHMsIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBo
YXZlIHRvIG1ha2UgYWJzdHJhY3QgYW5kIGNvbmNyZXRlIGNsYXNzZXMNCiAg
ICAjIEdldCByaWQgb2Ygc2xvdCBkZWNsYXJhdGlvbnMgdG8gcHJlcGFyZSB0
aGUgYWJzdHJhY3QgY2xhc3MgDQogICAgaWYgJ19fc2xvdHNfXycgaW4gY2xz
X2RpY3Q6DQogICAgICBkZWwgY2xzX2RpY3RbJ19fc2xvdHNfXyddDQoNCiAg
ICAjIHJlLXR1cGxlLWl6ZSB0aGUgYmFzZXMsIHNpbmNlIHR5cGUoKSB3YW50
cyB0aGVtIHRoYXQgd2F5DQogICAgbmV3X2Jhc2VzID0gdHVwbGUobmV3X2Jh
c2VzKQ0KDQogICAgIyBCdWlsZCB0aGUgYWJzdHJhY3QgdHlwZQ0KICAgIGFi
c3RyYWN0X3R5cGUgPSBzdXBlcihMYXp5U2xvdEJ1aWxkZXIsY2xzKS5fX25l
d19fKGNscywgJ2Fic3RyYWN0JytuYW1lLCBuZXdfYmFzZXMsIGNsc19kaWN0
KQ0KDQogICAgIyBCdWlsZCB0aGUgY29uY3JldGUgdHlwZSBvbiB0b3Agb2Yg
dGhlIGFic3RyYWN0DQogICAgY2xzX2RpY3QgPSB7fQ0KICAgIGNsc19kaWN0
WydfX3Nsb3RzX18nXSA9IHNsb3RzLmtleXMoKQ0KICAgIGNsc19kaWN0Wydf
X2Fic3RyYWN0X3R5cGUnXSA9IGFic3RyYWN0X3R5cGUNCg0KICAgICMgQnVp
bGQgYW5kIHJldHVybiB0aGUgbmV3IGNvbmNyZXRlIHR5cGUNCiAgICByZXR1
cm4gc3VwZXIoTGF6eVNsb3RCdWlsZGVyLGNscykuX19uZXdfXyhjbHMsIG5h
bWUsIChhYnN0cmFjdF90eXBlLCksIGNsc19kaWN0KQ0KDQoNCmRlZiB0ZXN0
X0xhenlTbG90QnVpbGRlcigpOg0KICBjbGFzcyBCYXNlKG9iamVjdCk6DQog
ICAgX19tZXRhY2xhc3NfXyA9IExhenlTbG90QnVpbGRlcg0KDQogIGNsYXNz
IEEoQmFzZSk6DQogICAgX19zbG90c19fID0gJ2EnDQoNCiAgY2xhc3MgQihC
YXNlKToNCiAgICBfX3Nsb3RzX18gPSAnYicNCg0KICBjbGFzcyBDKEIpOg0K
ICAgIF9fc2xvdHNfXyA9ICdjJw0KDQogIGNsYXNzIEFCKEEsQik6DQogICAg
X19zbG90c19fID0gWydhYiddDQoNCiAgY2xhc3MgQUJDKEEsQixDLEFCKToN
CiAgICBfX3Nsb3RzX18gPSBbJ2FiYyddDQoNCiAgYWJjPUFCQygpDQogIHBy
aW50IHR5cGUoYWJjKS5fX3Nsb3RzX18NCg0KaWYgX19uYW1lX18gPT0gJ19f
bWFpbl9fJzoNCiAgdGVzdF9MYXp5U2xvdEJ1aWxkZXIoKQ0K
--416156269-1032046193-1015426026=:8532--