[Python-Dev] User's complaints

Nick Coghlan ncoghlan at gmail.com
Thu Jul 13 14:57:30 CEST 2006


Jeroen Ruigrok van der Werven wrote:
> Hi Bob,
> 
> On 7/13/06, Bob Ippolito <bob at redivi.com> wrote:
>> Adding open classes would make it easier to develop DSLs, but you'd
>> only be able to reasonably do one per interpreter (unless you mangled
>> the class in a "with" block or something).
> 
> The person whose 'complaints' I was stating says that DSLs (Domain
> Specific Languages for those who, like me, were confused about the
> acronym) are a big part of what he is after and one per interpreter is
> fine by him. He also realises that the application(s) he needs them
> for might be unusual. He doesn't specifically need the builtin types
> to be extendable. It's just nice to be able to define a single class
> in multiple modules. Even C++ allows this to some extent (but not as
> much as he'd like).

I'm somewhat confused as to how Python's classes aren't open. Sure, types like 
the builtin types that don't have a __dict__ aren't open because there isn't 
anywhere to put the extensions, but metaclassing lets you do whatever you want 
to any other class:


def extends(orig_cls):
     if not hasattr(orig_cls, "__dict__"):
         raise TypeError("Cannot extend %r" % cls)
     class ExtendMeta(type):
         def __new__(mcl, name, bases, ns):
             if len(bases) != 1:
                 raise TypeError("Can only extend single class")
             if bases[0] is object:
                 return type.__new__(mcl, name, bases, ns)
             for key, value in ns.iteritems():
                 if key not in ("__metaclass__", "__dict__"):
                     setattr(orig_cls, key, value)
             return orig_cls
     class ExtendCls(object):
         __metaclass__ = ExtendMeta
     return ExtendCls

 >>> class A1(object):
...     def method1(self):
...         print "Hi, I'm method 1!"
...
 >>> class A2(extends(A1)):
...     def method2(self):
...         print "Hi, I'm method 2!"
...
 >>> x = A1()
 >>> x.method1()
Hi, I'm method 1!
 >>> x.method2()
Hi, I'm method 2!
 >>> y = A2()
 >>> y.method1()
Hi, I'm method 1!
 >>> y.method2()
Hi, I'm method 2!
 >>> A1 is A2
True

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-Dev mailing list