class Point(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return "(%f, %f)" % (self.x, self.y)
Din nou cunoştinţele de Lisp s-au dovedit foarte folositoare (deşi indirect). Căutând pe Google "python defstruct" (defstruct este macro-ul Lisp care creează codul pentru astfel de structuri) am dat de:
http://mail.python.org/pipermail/python-list/2001-October/109140.html
unde un suflet milostiv a publicat un exemplu simplu şi util de metaprogramare în Python.
am modificat puţin codul şi am obţinut:
def defstruct(name, *fields):
class Struct(object):
def __init__(self, *contents):
if len(contents) != len(self.structfields):
raise TypeError, (
"wrong number of arguments: expected %d %s, got %d" %
(len(self.structfields),
repr(self.structfields),
len(contents)))
for fieldnum in range(len(contents)):
setattr(self,
self.structfields[fieldnum],
contents[fieldnum])
def __repr__(self):
args = ", ".join([str(getattr(self, f)) for f in fields])
return "%s(%s)" % (name, args)
Struct.structfields = fields
return Struct
cu exemplul de utilizare:
if __name__ == "__main__":
Point = defstruct('Point', 'x', 'y')
p1 = Point(1, 20)
p2 = Point(-4, 34)
print p1
print p2
No comments:
Post a Comment