On Sun, Apr 30, 2006 at 11:55:03AM -0700, UnrealEd wrote:
> ok, bedankt.
> er is dus niet echt een manier om een variabele "behoorlijk" te definieren,
> behalve door hem een lege waarde mee te geven?

Door in de constructor vast de variabelen te definieren, vind ik het soms
wel wat handiger worden. Ik zou ze zelf dan eerder op 'None' zetten. Als je 
een hoop info in arrays of dicts wil gaan opslaan, zou ik die vast leeg
initialiseren (dus met [], {}, of list() en dict()).

Mijn logica hierachter is dat als je voor de gebruiker een dictionary
opslaat, dan initialiseer je 'm niet per se als zodanig. Als de gebruiker
(van je class) bijv. string=value kan aangeven, dan ben ik voorbereid met
een dictionary. 

Dus class Configuration, met config.set(key, val) heeft in de __init__ een
self.data = dict().
Class Storage daarentegen met storage.saveDict(dict) heeft in de __init__
een self.dictdata = None.

Maar goed, dat gaat meer op gevoel denk ik.

> dus eigenlijk hoef ik dit nergens te doen? toch een tegenvoorbeeldje: als ik
> een multidimensionele dictionary aanmaak, dan krijg ik een error als ik de
> variabele niet op van tevoren heb gedefinieerd, wat normaal is. als ik
> ervoor dan zet: a = dict, dan werkt het wel, hoewel ik volgens je uitleg een
> functie aanroep. of maakt dat geen verschil.

Even interactief:
>>> a = dict
>>> a
<type 'dict'>

>>> a = dict()
>>> a
{}

Had je niet a = dict() gedaan? Dict is een functie die de argumenten 
als dictionary terug geeft.
>>> b = dict(a=3, b=1)
{'a': 3, 'b': 4}

> en waarom maakt het uit of ik een methode heb die dezelfde naam heeft als
> een variabele in dezelfde class (inmijn geval self.income en self.income() )
> ? of ligt dat aan hetzelfde?

Weer interactief:
    >>> class X:
    ...      def __init__(self):
    ...          self.income = 3
    ...      def income(self):
    ...          return 5
    ...
    >>> x =X()
    >>> x.__dict__
    {'income': 3}
    >>> x.__class__.__dict__
    {'__module__': '__main__', '__doc__': None, '__init__': <function __init__
        at 0x40220f7c>, 'income': <function income at 0x40220fb4>}

Wat je dus kunt zien dat object 'x' een attribuut income heeft, met daarin nu
het getal 3.
De class van x heeft ook attributen, een ervan heeft ook 'income', en dat 
is een functie.

Dus welke wordt gebruikt?
    >>> x.income
    3

Eerst wordt bij het object of er een attribuut 'income' is. Die is er, 
dus klaar.

    >>> x.income()
    Traceback (most recent call last):
    File "<stdin>", line 1, in ?
    TypeError: 'int' object is not callable

Dit moet je dus lezen als (x.income) (). Nog steeds wordt 3 opgehaald,
en dan wordt geprobeerd om die aan te roepen (door de ()). Het 'int' object 
heeft hier geen ondersteuning voor, dus krijg je deze error.

Je hebt dus geen eenvoudige mogelijkheid meer om de functie income() 
aan te roepen. 

Groet,
Chris
_______________________________________________
Python-nl mailing list
Python-nl@python.org
http://mail.python.org/mailman/listinfo/python-nl

Antwoord per e-mail aan