46,233 views
26 votes
26 votes
Define an __init__ method that has all the field names as parameters (in the order they appear in the second argument to pnamedtuple) and initializes every instance name (using these same names) with the value bound to its parameter. For Point described above, the __init__ method would be

User Cegas
by
2.9k points

1 Answer

27 votes
27 votes

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML//EN">

<html><head>

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

<title>Program 3</title>

</head>

<body bgcolor="white">

<center>

<h1>Program 3</h1>

<h1>

Programs that Write Programs: pnamedtuple

</h1>

<p>

</p><h2>ICS-33: Intermediate Programming<br>

</h2>

<p>

</p></center>

<!-- Introduction -->

<a name="Introduction">

<hr align="left" width="33%">

<table rules="none" border="0" cellpadding="5" cellspacing="0" width="100%">

<tbody>

<tr valign="top">

<td width="20%"><b>Introduction</b></td>

<td width="80%">

This programming assignment is designed to show how Python functions can define

other Python code (in this case, a class) in an unexpected way: the function

can build a huge string that represents the definition of a Python class and

then call <b>exec</b> on it, which causes Python to define that class just as

if it were written in a file and imported (in which case Python reads the

file as a big string and does the same thing).

Your code will heavily rely on string formatting operations: I suggest using

the <b>str.format</b> method to do the replacements: now is a good time to

learn about this function if you don't know already know it; but you are free

to use whatever string processing tool(s) you want.

<p>

I suggest that you first read the description below and define/test/debug as

much of the <b>Point</b> class as you can, writing it directly in Eclipse

(especially the<b>__getitem__</b>, <b>__eq__</b>, and <b>_replace__</b>

methods).

You might want to write a small batch file to help you test this class.

</p><p>

Once you have written/debugged the code for the <b>Point</b> class, define the

general <b>pnamedtuple</b> function, which when given the appropriate

arguments (for the <b>Point</b> class: <b>pnamedtuple('Point', 'x y')</b>)

constructs a huge string containing the same code as the <b>Point</b> class

you wrote.

Much of the code from your <b>Point</b> class will be turned into strings and

made generic: generalized for calls to <b>pnamedtuple</b> with different

arguments.

Use the <b>.format</b> method to replace the generic parts with the actual

strings needed for the class being defined.

User Demodave
by
2.8k points