LINUX.ORG.RU

Python - Атрибуты класса


0

0

Сегодня стукнуло в голову выучить python, качнул книжку Гвидо и вперёд...
За пару часов прочтения родилась пара вопросов...

Как сделать атрибуты класса частными(private)?
Прочитал у Гвидо, что __MyFoo... 

Вот пример

class MyClass:
    __Attr = 1 #типа частный атрибут
    def Foo(self):
        print __Attr

a = MyClass()
a.Foo()

$./sript1.py
NameError: global name '_MyClass__Attr' is not defined

Прочитал, что имя частного атрибута преобразовывается в _ClassName__AttributeName... 
Только, что это значит - не понятно... приведите, пожалуйста, простейший пример 
использования частного атрибута.


И ещё вопрос  - есть ли в питоне нечто вроде С++/Java/C#-нутого protected? Я что-то в доках 
не нашёл как наследовать частные атрибуты класса...

ЗЫ В общем, впечатления от языка самые лучшие...

Re: Python - Атрибуты класса

>>> class R:
... def __init__(self):
... self.__foo = "simple string"
... def bar(self):
... print self.__foo
...
>>> r = R()
>>> r.bar()
simple string
>>> r.__foo
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: R instance has no attribute '__foo'

kondor ★★★ ()

Re: Python - Атрибуты класса

И так тоже можно :).

>>> class T:

... __foo = "simple string"

... def bar(self):

... print self.__foo

...

>>>

>>> t = T()

>>> t.bar()

simple string

>>> t.__foo

Traceback (most recent call last):

File "<stdin>", line 1, in ?

AttributeError: T instance has no attribute '__foo'

kondor ★★★ ()
Ответ на: Re: Python - Атрибуты класса от kondor

Re: Python - Атрибуты класса

Спасибо... тут ясно.

А как на счет второго вопроса, potected т.е. как унаследовав класс унаследовать его частные атрибуты так, чтобы к ним можно было обратиться как к атрибутам дочернего класса?

golodranez ★★★★ ()
Ответ на: Re: Python - Атрибуты класса от golodranez

Re: Python - Атрибуты класса

class MyClass:
    __Attr = 1
    def Foo(self):
	 print self.__Attr


class EE(MyClass):
    def R(self):
         print self._MyClass__Attr # Вот так обращаемся в случае наледования частного атрибута
# а хотелось бы напрямую - типа self.__Foo
 

golodranez ★★★★ ()
Ответ на: Re: Python - Атрибуты класса от golodranez

Re: Python - Атрибуты класса

> а хотелось бы напрямую - типа self.__Foo

Я сам не так давно начал изучать Python, но на данный момент, насколько я понимаю, в Python отсутсвуют явные protected members && attributes.

И посему народ развлекается ;-), и творит различные workarounds, например, как этот: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496920

kondor ★★★ ()
Ответ на: Re: Python - Атрибуты класса от kondor

Re: Python - Атрибуты класса

>Я сам не так давно начал изучать Python

А я только сегодня)))

>в Python отсутсвуют явные protected members && attributes.

Как-то странно... надо порыться по докам хорошенько

Тут CrazyPit вроде спец по питону, мож заглянет - растолкует)))

golodranez ★★★★ ()
Ответ на: Re: Python - Атрибуты класса от golodranez

Re: Python - Атрибуты класса

>Как-то странно... надо порыться по докам хорошенько

Ничего странного. Гвидо сказал "нехрен мешать программисту". Если ему не нужно будет доступаться - он сможет это легко сделать (не доступаться) и без "протектедов" разных. А если вдруг понадобится - будет хорошо, если ему ничего не помешает.

DonkeyHot ★★★★★ ()
Ответ на: Re: Python - Атрибуты класса от DonkeyHot

Re: Python - Атрибуты класса

>Ничего странного. Гвидо сказал "нехрен мешать программисту". Если ему не нужно будет доступаться - он сможет это легко сделать (не доступаться) и без "протектедов" разных. А если вдруг понадобится - будет хорошо, если ему ничего не помешает.

Так убралбы ещё и частные атрибуты, и небыло бы вопросов, а так не то, не сё....

Можно вот так, но это же чушь - 
class A:
    __Var = "Hello!"
    def f(self):
        print self.__Var

class B(A):
    def g(self):
        print self._A__Var


golodranez ★★★★ ()
Ответ на: Re: Python - Атрибуты класса от DonkeyHot

Re: Python - Атрибуты класса

>Да, забыл. Не пиши '__' вначале. Какие проблемы

Шутки шутками, но я серьёзно... Как наследовать приватные атрибуты класса?

golodranez ★★★★ ()
Ответ на: Re: Python - Атрибуты класса от golodranez

Re: Python - Атрибуты класса

>Так убралбы ещё и частные атрибуты, и небыло бы вопросов, а так не то, не сё

Их невозможно убрать - ибо их там нет. То, что таковым прикидывается - маленький предохранитель от случайного использования того, что не стоит использовать. Это делается посредством создания мелкого неудобства при использовании хитро-названых аттибутов.

>Шутки шутками, но я серьёзно... Как наследовать приватные атрибуты класса?

Где ты видел шутку? Нет у питона "защиты" аттрибутов. Повторяю: нет понятия "личных", "защищённых" - они все общедоступные. Соответственно они наследуются точно так же, как и остальные. За исключением мелкой хитрости с испохабливанием имён, начинающимися с '__'.

Неужели трудно поверить, что где-то может быть проще чем в .... ?

DonkeyHot ★★★★★ ()
Ответ на: Re: Python - Атрибуты класса от DonkeyHot

Re: Python - Атрибуты класса

>Повторяю: нет понятия "личных", "защищённых" - они все общедоступные. Соответственно они наследуются точно так же, как и остальные. За исключением мелкой хитрости с испохабливанием имён, начинающимися с '__'.

А что это тогда, как не частные атрибуты? Для членов класс доступны, для остальных нет - частные атрибуты.

Вот кусок документации: There is limited support for class-private identifiers. Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is now textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard of the syntactic position of the identifier, so it can be used to define class-private instance and class variables, methods

golodranez ★★★★ ()
Ответ на: Re: Python - Атрибуты класса от golodranez

Re: Python - Атрибуты класса

Насколько я понял, идея Гвидо состоит в том, что кажый атрибут можно защитить аксессером, так? Но для каждой мухи писать аксессор - этож гемор...

Т.е. Обычные(общие) атрибуты с аксессорыми - это что-то вроде С++'нутого protected, а атрибуты вида __Name - это типа private(наследованию не подлежат) - вроде картина вырисовывается...

или я что не понял?

golodranez ★★★★ ()
Ответ на: Re: Python - Атрибуты класса от golodranez

Re: Python - Атрибуты класса

А еще есть методы __setattr__(), __getattr__() и __delattr__(). С их помощью организовываются "нормальные" private методы и аттрибуты. А как такого protected в питоне нет.

parser ★★ ()
Ответ на: Re: Python - Атрибуты класса от parser

Re: Python - Атрибуты класса

>А еще есть методы __setattr__(), __getattr__() и __delattr__().

В сообщении на которое ты отвечаешь, я писал про аксессоры :)) Это они и есть :))

В следующий раз читай вниметельней :)

golodranez ★★★★ ()
Ответ на: Re: Python - Атрибуты класса от parser

Re: Python - Атрибуты класса

>С их помощью организовываются "нормальные" private методы и аттрибуты. А как такого protected в питоне нет.

Может ты путаешь private и provected? С помощью аксессоров можно получить достум к атрибутам даже при наследовании и заодно защитить их от _плохого_ доступа - натуральный protected

golodranez ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.