Article View: pl.comp.lang.python
Article #26767Re: python vs php - potrzebne argumenty
From: Jaroslaw Zabiello
Date: Sun, 01 Nov 2009 23:28
Date: Sun, 01 Nov 2009 23:28
61 lines
3273 bytes
3273 bytes
Dnia 01-11-2009 o 20:00:29 pakalk <pakalk@gmail.com> napisał(a):
> Poza tym, to nie ma nic takiego jak protected, przynajmniej w Py2.6 -
> mylę się?
>
> class ProtTest:
> _x = "Zmienna chroniona?"
>
> def _foo( self ):
> return "Funkcja chroniona?"
>
> o = ProtTest()
>
> print o._x
> print o._foo()
Tylko, że tak będzie pisał tylko ktoś kto nie ma pojęcia o Pythonie. Każdy
pythonista dobrze wie, że nie należy wywoływać tak nazwanych atrybutów
jakby to były atrybuty publiczne. Każdy (po nazwie) od razu widzi, że to
nie jest atrybut publiczny i po prostu tak się to traktuje. To wszystko
kwestia umowy. Ale aby to wiedzieć, trzeba wpierw chociaż poczytać sobie o
Pythonie i jego założeniach (btw, klas też się tak od dawna nie tworzy
tak, jak w twym przykładzie).
Te wszystkie kwalifikatory protected i private to kwestia konwencji. W
Pythonie wszystkie atrybuty są publiczne z definicji. Co nie znaczy, że
można przez pomyłkę coś nadpisać. Nie, trzeba to chcieć, zrobić celowo.
Np.
>>> class ProtTest(object):
... __x = "Zmienna prywatna"
...
>>> o = ProtTest()
>>> o.__x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'ProtTest' object has no attribute '__x'
>>> o._ProtTest__x
'Zmienna prywatna'
Z drugiej strony, jak ktoś chce, to w PHP5 też łatwo uzyska dostęp do jego
"atrybutów chronionych":
<?php
class ProtTest {
private $priv = "Zmienna prywatna?";
protected $prot = "Zmienna chroniona?";
}
$o = new ProtTest();
$a = (array)$o;
print $a["\0ProtTest\0priv"]; # => Zmienna prywatna?
print $a["\0*\0prot"]; # => Zmienna chroniona?
?>
Więc, nie rozumiem tu twojej krytyki Pythona. Poza tym upada ona zupełnie
przy Ruby, który posiada te kwalifikatory dostępu.
--
JZ http://blog.zabiello.com
Technical Details
Message-ID:
<op.u2qotzozeaqjf2@macbook-pro-15-zbiru.local>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mailReferences:
<h83in7$rl3$1@inews.gazeta.pl> <b9dc7116-39db-474f-9282-8862b3f1cad2@d5g2000yqm.googlegroups.com> <a501db87-9ccf-4694-a8f8-330a67cdc839@15g2000yqy.googlegroups.com> <7aa62383-88c2-4138-89d6-594112504075@g27g2000yqn.googlegroups.com> <op.u2nhqrhyeaqjf2@macbook-pro-15-zbiru.local> <97ad13b9-95bf-4c61-8a1b-59c7c57e8499@s31g2000yqs.googlegroups.com> <op.u2oi93ceeaqjf2@macbook-pro-15-zbiru.local> <12b7fbaa-206c-4b39-8868-4e3b96eea704@37g2000yqm.googlegroups.com> <op.u2p83sqyeaqjf2@macbook-pro-15-zbiru.local> <c3247d6d-5199-4c45-9825-772387effd7b@f16g2000yqm.googlegroups.com> <819ec9ea-fb64-4947-b8e3-08492d688c1a@d5g2000yqm.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mail From: "Jaroslaw Zabiello" <usenet@onet.eu> Newsgroups: pl.comp.lang.python Subject: Re: python vs php - potrzebne argumenty Date: Sun, 01 Nov 2009 23:28:37 -0000 Organization: http://onet.pl Lines: 82 Message-ID: <op.u2qotzozeaqjf2@macbook-pro-15-zbiru.local> References: <h83in7$rl3$1@inews.gazeta.pl> <b9dc7116-39db-474f-9282-8862b3f1cad2@d5g2000yqm.googlegroups.com> <a501db87-9ccf-4694-a8f8-330a67cdc839@15g2000yqy.googlegroups.com> <7aa62383-88c2-4138-89d6-594112504075@g27g2000yqn.googlegroups.com> <op.u2nhqrhyeaqjf2@macbook-pro-15-zbiru.local> <97ad13b9-95bf-4c61-8a1b-59c7c57e8499@s31g2000yqs.googlegroups.com> <op.u2oi93ceeaqjf2@macbook-pro-15-zbiru.local> <12b7fbaa-206c-4b39-8868-4e3b96eea704@37g2000yqm.googlegroups.com> <op.u2p83sqyeaqjf2@macbook-pro-15-zbiru.local> <c3247d6d-5199-4c45-9825-772387effd7b@f16g2000yqm.googlegroups.com> <819ec9ea-fb64-4947-b8e3-08492d688c1a@d5g2000yqm.googlegroups.com> NNTP-Posting-Host: 78.16.107.141 Mime-Version: 1.0 X-Trace: news.onet.pl 1257118121 23035 78.16.107.141 (1 Nov 2009 23:28:41 GMT) X-Complaints-To: niusy@onet.pl NNTP-Posting-Date: Sun, 1 Nov 2009 23:28:41 +0000 (UTC) To: pakalk <pakalk@gmail.com> User-Agent: Opera Mail/10.01 (MacIntel) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit