From: Ross Williamson on
Hi Everyone,

Just a quick question - Is it possible to assign class variables in
the __init__() - i.e. somthing like:

def __init__(self,self.source = "test", self.length = 1)

rather than

def __init__(self,source = "test", length = 1):


--
Ross Williamson
University of Chicago
Department of Astronomy & Astrophysics
773-834-9785 (office)
312-504-3051 (Cell)
From: Mark Lawrence on
On 08/06/2010 17:04, Ross Williamson wrote:
> Hi Everyone,
>
> Just a quick question - Is it possible to assign class variables in
> the __init__() - i.e. somthing like:
They're instance variables, not class variables.
>
> def __init__(self,self.source = "test", self.length = 1)
No.
>
> rather than
>
> def __init__(self,source = "test", length = 1):
>
>
Why not try this from an interactive prompt, quicker than posting and
waiting for a reply?

Kindest regards.

Mark Lawrence.


From: Peter Otten on
Ross Williamson wrote:

> Hi Everyone,
>
> Just a quick question - Is it possible to assign class variables in
> the __init__() - i.e. somthing like:
>
> def __init__(self,self.source = "test", self.length = 1)
>
> rather than
>
> def __init__(self,source = "test", length = 1):

No. If you are just lazy, try

>>> import sys
>>> def update_self():
.... d = sys._getframe(1)
.... d = d.f_locals
.... self = d.pop("self")
.... for k, v in d.iteritems():
.... setattr(self, k, v)
....
>>> class A(object):
.... def __init__(self, source="test", length=1):
.... update_self()
.... def __repr__(self):
.... return "A(source=%r, length=%r)" % (self.source,
self.length)
....
>>> A()
A(source='test', length=1)
>>> A(length=42)
A(source='test', length=42)

Personally, I prefer explicit assignments inside __init__().

Peter
From: Steven D'Aprano on
On Tue, 08 Jun 2010 17:24:55 +0100, Mark Lawrence wrote:

> On 08/06/2010 17:04, Ross Williamson wrote:
>> Hi Everyone,
>>
>> Just a quick question - Is it possible to assign class variables in the
>> __init__() - i.e. somthing like:
>
> They're instance variables, not class variables.

In the usual Python terminology, they're instance *attributes*. If a
float variable is a variable storing a float, and a string variable is a
variable storing a string, then in a language like Python where classes
are first-class objects a class variable is a variable storing a class.

That's why Python has functions getattr, setattr and delattr, and special
methods __getattr__ etc., rather than "getvar" etc.

I realise that other languages use "class variable" and "instance
variable" to mean something completely different, but we don't have to
emulate their mistakes... *wink*



--
Steven
From: Jason Scheirer on
On Jun 8, 9:37 am, Peter Otten <__pete...(a)web.de> wrote:
> Ross Williamson wrote:
> > Hi Everyone,
>
> > Just a quick question - Is it possible to assign class variables in
> > the __init__() - i.e. somthing like:
>
> > def __init__(self,self.source = "test", self.length = 1)
>
> > rather than
>
> > def __init__(self,source = "test", length = 1):
>
> No. If you are just lazy, try
>
> >>> import sys
> >>> def update_self():
>
> ...     d = sys._getframe(1)
> ...     d = d.f_locals
> ...     self = d.pop("self")
> ...     for k, v in d.iteritems():
> ...             setattr(self, k, v)
> ...>>> class A(object):
>
> ...     def __init__(self, source="test", length=1):
> ...             update_self()
> ...     def __repr__(self):
> ...             return "A(source=%r, length=%r)" % (self.source,
> self.length)
> ...>>> A()
>
> A(source='test', length=1)>>> A(length=42)
>
> A(source='test', length=42)
>
> Personally, I prefer explicit assignments inside __init__().
>
> Peter

Or more simply

def __init__(self, source = "test", length = 1):
for (k, v) in locals().iteritems():
if k != 'self':
setattr(self, k, v)