Diky za vysoce informativni clanek.
Ze zavedeni tridnich a statickych metod mam pochopitelne radost, ale zpusob jejich vytvareni se mi zda ponekud nestastny. S timto pristupem bychom mohli zrusit i klicove slovo class a tridy vytvaret volanim funkce bless() :-) (to bychom teda dopadli :)
nebylo by prehlednejsi treba
def class foo(cls):
a
def static foo():
I properties by se daly resit syntaxi:
class c:
__ property value:
____ "docstring"
____ def get(self): ...
____ def set(self, val): ...
(ta podtrzitka tam jsou jen kvuli indentaci)
Treba to nejakym takovym zpusobem chteji udelat a proto to zatim nemaji v dokumentaci.
Zavedeni novych klicovych slov na sebe vaze velke nekolik problemu. Predne: pokud se dane klicove slove vyskytuje v nejakem jiz existujicim kodu, bude si interpretr stezovat na spatnou syntaxi (dojde k vyjimce SyntaxError, viz dalsi dil). Guido se zavadeni novych klicovych slov snazi vyhnout (verze 2.2 zavedla jen jedno nove klicove slovo 'yield', urcene pro vytvareni generatoru, mimochodem to je nesmirne zajimava cast programovani v Pythonu a urcite se ji take budeme venovat).
Pro zavadeni novych vlastnosti do jazyka jsou ustaveny dokumenty PEPs (Python Enhancement Proposals, http://python.sourceforge.net/peps/). V nich jsem ale o properties a spol. nenasel nic. Neni tam ani nic o planovanem zavedeni novych klicovych slov.
Zavedeni novych klicovych slov by samozrejme problemy zpusobilo. To jsem si spis jen pustil fantazii na spacir, jak by to mohlo vypadat, kdyby to bylo uz od zacatku soucasti navrhu jazyka. Ostatne, pokud bych ve svem starem kodu pouzival funkci staticmethod nebo property, mam problem taky a mozna se projevi daleko zahadnejsim zpusobem...
Prave ze ne. Funkce property a staticmethod jsou definovany v builtin prostoru jmen, ktery je az na konce retezce pri vyhledavani jmen promennych. Pokud je jiz tato funkce v existujicim kodu, "prekryje" vestavenou funkci. Pokud bychom chteli pouzivat funkci property() z vestaveneho modulu museli bysme udelat neco takoveho:
def property(*arg, **kwarg):
..'Dejme tomu, ze toto je nase puvodni funkce'
import __builtin__
class foo:
..'Zde chceme pouzivat vestavenou property()'
..bar = __builtin__.property()
(Pozn.: tecky ze zacatku radku znaci odsazeni)
K chybne funkci by doslo, kdyby nase puvodni property() byla v nejakem modulu a my ji volali z jineho. Kdybychom totiz z tohoto modulu zapomneli naimportovat funkci property(), volala by se vestavena. Zde je to jiz jen o zdatnosti programatora, jak rychle by se s timto opomenutim vyporadal.
class Bla(object):
def __init__(self):
self.a = 'abvc'
self.voltage = 'ac'
#class metoda -----
@classmethod
def saySomethingClassic(cls):
print('hi')
print(cls)
#static metoda -----
@staticmethod
def saySomethingStatic(txt):
print(txt)
#property - zpusob 1. -----
voltage = property(doc="hello, this is documentation")
@voltage.getter
def voltage(self):
print('voltage getter')
return self._voltage;
@voltage.setter
def voltage(self, value=None):
print('voltage setter')
self._voltage = value
#property - zpusob 2. -----
@property
def current(self):
print('curr getter')
return self._current
@voltage.deleter #tohle jde taky
@current.setter
def current(self, val = None):
print('curr setter')
self._current = val
a = Bla()
Bla.saySomethingClassic()
Bla.saySomethingStatic('abcCfc')
print(a.voltage)
a.voltage = 'adsdasXXXd'
print(a.voltage)
print(Bla.voltage.__doc__)
a.current = '1A'
print(a.current)
... no presto doufam, ze se odnaucim jako Javista pouzivat settery/gettery :]