[python] Přetěžování metod v Pythonu

Petr Zloty petr.zloty na gmail.com
Pátek Srpen 29 13:11:21 CEST 2008


jj predefinuje prvni funkci, takze pretezovani funkce ala C++ podle
poctu parametru neumoznuje bez **keywords resp. * args (Musim projit
jeden stary zdrojak kde jsem tohle pouzival a "nejak" to fungovalo :/,
ale v ramci metod se da pouzit viz prvni priklad nebo tenhle fukcni
kod:

class Master:
	def a(self, x=0):
		print 'jeden argument'

class Commander(Master):
	def a(self, x=0,y=0):
		print 'dva argumenty'
		
	def b(self, x=0, y=0):
		Master().a()
		

a = Master()
a.a()	# puvodni metoda a

b = Commander()
b.a()	# nova metoda a
b.b()	# puvodni metoda a

coz je pretezovani metod ve tride

Hodi se to pokud clovek potrebuje stejne chovani jako built in typy,
nebo potrebuje zmenit chovani built in typu, popripadne si chce
zjednodusit nektere zapisy, osobne jsem to v nejak zvlast velke mire
jeste nevyuzil, davam prednost metodam, takze misto:

NewCollection = CollectionA + CollectionB  ##objekt Collection
nadefinovany nekde ve tride, operator + nadefinovany ve stejne tride
pomoci def __add__: etc...

## pouzivam napr:

NewCollection.Add(CollectionA)   ## metoda Add menici objekt in-place
NewCollection.Add(CollectionB)

2008/8/29 David Michal <dmichal na altien.com>:
>> -----Original Message-----
>> From: python-bounces na py.cz [mailto:python-bounces na py.cz] On Behalf Of
>> Petr Zloty
>> Sent: Friday, August 29, 2008 10:59 AM
>> To: Konference PyCZ
>> Subject: Re: [python] Přetěžování metod v Pythonu
>>
>> pretezovani operatoru:
>>
>> ve tride definuj metodu __add__: pro scistani __mul__ pro nasobeni
>> atd..
>>
>> tenhle priklad funguje pokud se pouzijou keywords argumenty,
>> prirovnanim k C staci incializovat promenne, tudiz tohle funguje:
>>
>> def a(x=0):
>>    print x
>>
>> def a(x=0,y=0):
>>    print x + y
>>
>> a(1)
>> a(1,1)
>>
> No funguje, ale ta prvni definice a je tam zbytecna. Python je interpretovany jazyk, takze pri provadeni kodu jede pekne radek po radce. V tomhle pripade tedy nejdrive nadefinuje a jako a(x=0)... a pak to prepise definici a(x=0,y=0)....Takze priklad:
>
> def a(x=0):
>    print 'jeden argument'
>
> def a(x=0,y=0):
>    print 'dva argumenty'
>
> a(1)
> a(1,1)
>
> uz moc dobre fungovat nebude.
>
> Ad k tomu pretizeni operatoru, kdy to pouzivat? V jakem pripade se to hodi?
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>


Další informace o konferenci Python