Question about classes
Steven Bethard
steven.bethard at gmail.com
Mon Nov 22 01:39:53 EST 2004
Ben wrote:
> class foo(xstart):
> x = 5
> if xstart != 0:
> x = xstart
>
> a = foo(8)
>
> What I am curious about is why not? What am I missing about classes here?
> Is the functionality delivered in some other fashion, or must I:
>
> class foo:
> x = 5
>
> a = foo()
> a.x = 8
The parentheses after a class name do not indicate a parameter list;
they indicate the list of base classes. So generally, they must by
classes/types:
>>> def make_class(base):
... class C(base):
... pass
... return C
...
>>> make_class(object)
<class '__main__.C'>
>>> make_class(1)
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "<interactive input>", line 2, in make_class
TypeError: Error when calling the metaclass bases
int() takes at most 2 arguments (3 given)
If you want to set a class or instance variable for an object at
instantiation time, you probably want to supply the __init__ method:
>>> class C(object):
... x = 5
... def __init__(self, x):
... if x != 0:
... C.x = x
...
>>> c = C(0)
>>> c.x
5
>>> c = C(8)
>>> c.x
8
It seems strange to me that you want to set a *class* variable here, not
an instance variable, though perhaps you have your reasons. Note that
by doing so, every time you make a new instance, you'll change the x
attribute for all objects:
>>> C.x
5
>>> c1 = C(0)
>>> c1.x
5
>>> C.x
5
>>> c2 = C(8)
>>> c2.x
8
>>> c1.x
8
>>> C.x
8
If instead, you intended to set an instance variable, you might write it
like:
>>> class C(object):
... def __init__(self, x):
... if x != 0:
... self.x = x
... else:
... self.x = 5
...
>>> c = C(0)
>>> c.x
5
>>> c = C(8)
>>> c.x
8
Steve
More information about the Python-list
mailing list