[Python-ideas] Make-statement [Re: Different interface for namedtuple?]

Arnaud Delobelle arnodel at gmail.com
Sun Mar 6 01:56:03 CET 2011


On 5 Mar 2011, at 23:18, Greg Ewing wrote:

> Carl M. Johnson wrote:
> 
>> make NamedTuple(rename=True) Point:
>>    x, y
>> make Table() Author:
>>    firstname, lastname, DOB = Str(), Str(), Date()
> 
> I did some thinking about this kind of thing once when I was
> considering Python as a language for interactive fiction. When
> writing IF, you tend to have a lot of unique objects with
> special behaviour, and to support this, dedicated IF languages
> such as TADS usually have a construct that's somewhere between
> a class declaration and an instantiation.
> 
> For Python, I postulated an "instance" statement that would
> be used something like this:
> 
>  instance Wardrobe(Thing):
> 
>    name = "wardrobe"
>    description = "A nice mahogany double-door wardrobe."
> 
>    def take(self):
>      print "The wardrobe is too heavy to pick up."
> 
> What this would do is first create an anonymous subclass of
> Thing, and then instantiate that subclass.


That's interesting, I once wrote a simple IF engine in Python and I wanted to achieve this almost exactly!  I solved it as follows: instances are declared as classes inheriting from their type and the special type named Instance.  So the the class definition below binds "House" to an instance of Location.

class House(Instance, Location):
    description = "a small country house"
    long_description = "You are in a small country house."
    objects = RedKey, WoodenChest, BackDoor
    def go_south():
        if BackDoor.is_open:
            message('you step through the door into the garden.')
            location = Garden
        else:
            message("You can't go THROUGH the door, it's closed!")


Instance was defined as follows:

class MetaInstance(MetaObject):
    def __init__(cls, name, bases, attrs):
        pass

class Instance(object):
    __metaclass__ = MetaInstance

@staticmethod
def MetaInstance__new__(meta, name, bases, attrs):
    bases = list(bases)
    bases.remove(Instance)
    cls = bases.pop()
    return cls(**attrs)

MetaInstance.__new__ = MetaInstance__new__

-- 
Arnaud




More information about the Python-ideas mailing list