[python-nl] classes importeren uit subfolders
A.T.Hofkamp
a.t.hofkamp at tue.nl
Wed Mar 8 13:26:40 CET 2006
Hallo,
Thomas Devriendt wrote:
> Hallo,
>
> Het is inderdaad zo dat MasterClass een object UserData aanmaakt, en daar
> bewerkingen mee uitvoert.
Dit lees ik als
class MasterClass:
def __init__(self):
self.udata = UserData()
def doit():
# doe dingen met self.udata
>
> Wat ik wel niet goed versta is dit:
>
>
>>Als je die naam namelijk hard-coded in MasterClass hebt zitten kun je
>
>
>>nooit meer een ander data base object gebruiken in je MasterClass,
>
>
>>want dan moet je eerst de source van MasterClass aanpassen.
>
>
> Ik maak helemaal in het begin van MasterClass zulk een object aan, en wijs
> dat toe aan een member-variabele van masterClass. Op deze mannier kan ik
> toch eenvoudig van database object wisselen, of versta ik u verkeerd?
Voetnoot: je mag wel tutoyeren, al is dat wellicht een typisch nederlandse
gewoonte?
Hoe wou je dat doen zonder source code wijziging?
Je moet dan op zijn minst masterclass.py wijzigen met de nieuwe naam.
Bovenstaande lees ik als " 'MasterClass' heeft specifiek 'UserData' class
nodig, die laatstgenoemde class is dus onderdeel van MasterClass.".
Dat is anders dan "MasterClass heeft _een_ (ie *any*) class nodig die database
access voor hem doet". Met andere woorden, het maakt MasterClass niet uit waar
die userdata vandaan komt, hij heeft een object die dat regelt.
In dat laatste geval wil je niet dat MasterClass de naam van het UserData
object weet.
Ik los dat vaak op met
class MasterClass:
def __init__(self,udata):
self.udata = udata
etc
Nu krijgt de MasterClass een UserData object (of eigenlijk, een object wat
zich (hopelijk) gedraagt als een UserData object. MasterClass weet nu niet wat
hij krijgt (als in "dat is voor hem niet van belang, zolang het zich maar
houdt aan de interface definitie die MasterClass veracht.").
Omdat nu de classdefinitie van UserData niet gebruikt wordt, hoeft die ook
niet ge-importeert te worden.
> Je bedoelt dat ik de member-function van UserData zonder de class te
> initiëren kan aanroepen?
>
> Vb:
>
> userdata = userData().getUserInfo()
Hier maak je wel degelijk een UserData object aan, namelijk vlak voor de
aanroep naar getUserInfo(). Vlak na de assignment gooi je dan het object weer weg.
Je kunt in new-style classes wel zg class-methods gebruiken (in C++ zijn dat
static methods (geloof dat ze in Java ook zo heten)). Class methods zijn in
Python afaik de enige manier om methods aan te roepen zonder een object te
construeren.
> Qua printen heb je zeker gelijk. Maar ik vind het gewoon te onoverzichtelijk
> om alles, onderverdeeld in "hoofdstukken", in dezelfde file te zetten. Maar
> dit is misschien vanwege mijn ervaring in php: daar werd elke keer als je de
> class aanriep het hele bestand geladen, en voor de bandwijdte was dit vrij
> lastig, daarom splitste ik zoveel als ik kon.
Je bedoelt waarschijnlijk 'responsie snelheid' ipv 'bandbreedte'.
Ik weet niet of dat ook gedaan zou hebben, ik heb een hekel aan beperkingen
die een broken implementatie mij opleggen. Waarschijnlijk zou ik wat scripts
in elkaar geflanst hebben die als post-processing stap mijn sources uit elkaar
trekken naar iets wat snel gedraaid kan worden.
(maar goed, mijn vak is compilatie en code-generatie, dus ik doe dat soort
dingen bijna dagelijks).
Als je meer code in 1 file stop kost inderdaad wat extra moeite om subdelen in
de file uit elkaar te houden. Ik gebruik daar regels commentaar voor als bijv
#
# =====================================================================
# USER INFORMATIE
#
wat zelfs als je page-up/down scrolled door de editor nog opvalt.
Wat ook erg goed werkt is is een blok docstring, al ben ik daar zelf niet zo'n
voorstander van, het breekt de code zo als je de weg weet in de files
(maar dat is ongetwijfeld een gebrek mijnerzijds, en deze mening zal op de
mailing-lijst niet gedeeld worden :-) ).
> In Java doe ik het ook zoals ik zei, gewoonweg om overzicht te houden.
Java vindt dat ook een goede gewoonte afaik (ik heb ongeveer 2 Java
programmaatjes geschreven tot nu toe (elk van < 30 regels), dus erg veel
zinnigs kan ik er niet over zeggen).
> PS: staat het oorspronkelijke bericht hier nu?
Ja, dat gaat allemaal goed.
Wat beter zou zijn is dat mijn posts niet bouncen natuurlijk.
Via mail melden dat er wat mis gaat is alleen wat moeilijk als alle admin
adressen ook op python.org zitten... :-(
Albert
More information about the Python-nl
mailing list