Object's nesting scope

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Sat Aug 29 06:37:37 CEST 2009


En Fri, 28 Aug 2009 15:25:55 -0300, zaur <szport 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




More information about the Python-list mailing list