Object's nesting scope

zaur szport at gmail.com
Sat Aug 29 09:34:48 CEST 2009


On 29 авг, 08:37, "Gabriel Genellina" <gagsl-... at yahoo.com.ar> wrote:
> En Fri, 28 Aug 2009 15:25:55 -0300, zaur <szp... at gmail.com> escribió:
>
>
>
> > On 28 авг, 16:07, Bruno Desthuilliers <bruno.
> > 42.desthuilli... at websiteburo.invalid> wrote:
> >> zaur a écrit :
>
> >> > Ok. Here is a use case: object initialization.
>
> >> > For example,
>
> >> > person = Person():
> >> >   name = "john"
> >> >   age = 30
> >> >   address = Address():
> >> >      street = "Green Street"
> >> >      no = 12
>
> >> > vs.
>
> >> > person = Person()
> >> > person.name = "john"
> >> > person.age = 30
> >> > address = person.address = Address()
> >> > address.street = "Green Street"
> >> > address.no = 12
>
> >> Err... Looks like you really should read the FineManual(tm) -
> >> specifically, the parts on the __init__ method.
>
> >> class Person(object):
> >>     def __init__(self, name, age, address):
> >>         self.name = name
> >>         self.age = age
> >>         self.address = address
>
> >> class Address(object):
> >>     def __init__(self, street, no):
> >>         self.no = no
> >>         self.street = street
>
> >> person = Person(
> >>     name="john",
> >>     age=30,
> >>     address = Address(
> >>         street="Green Street",
> >>         no=12
> >>     )
> >> )
>
> > What are you doing if 1) classes Person and Address imported from
> > foreign module 2) __init__ method is not defined as you want?
>
> Welcome to dynamic languages! It doesn't matter *where* the class was  
> defined. You may add new attributes to the instance (even methods to the  
> class) at any time.
>
> 1)
> person = Person()
> vars(person).update(name="john",age=30,address=Address())
> vars(person.Address).update(street="Green Street",no=12)
>
> 2)
> def the_initializer_i_would_like(person, name, age):
>    person.name = name
>    person.age = age
>
> person = Person()
> the_initializer_i_would_like(person, name="john", age=30)
>
> 3)
> def the_initializer_i_would_like(self, name, age):
>    self.name = name
>    self.age = age
>
> Person.init = the_initializer_i_would_like
> person = Person()
> person.init(name="john", age=30)
>
> 4)
> def a_generic_updater(obj, **kw):
>    try: ns = vars(obj)
>    except Exception: ns = None
>    if ns is not None:
>      ns.update(kw)
>    else:
>      for name in kw:
>        setattr(obj, name, kw[name])
>
> person = Person()
> a_generic_updater(person, name="john", age=30)
>
> --
> Gabriel Genellina

I know about these ways of object initializing. What I said is about
using object's dictionary as nested scope in code block. Object
initialization is just one use case.
So we say about different things.



More information about the Python-list mailing list