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? Я что-то в доках 
не нашёл как наследовать частные атрибуты класса...

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

>>> 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 ★★★
()
Ответ на: комментарий от kondor

Форматирование сбилось. Но, надеюсь, общая идея ясна ;).

kondor ★★★
()

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

>>> 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 ★★★
()
Ответ на: комментарий от kondor

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

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

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

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


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

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

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

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

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

kondor ★★★
()
Ответ на: комментарий от kondor

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

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

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

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

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

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

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

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

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

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

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

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

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


golodranez ★★★★
() автор топика
Ответ на: комментарий от DonkeyHot

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

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

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

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

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

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

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

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

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

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

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

Вот кусок документации: 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 ★★★★
() автор топика
Ответ на: комментарий от golodranez

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

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

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

golodranez ★★★★
() автор топика
Ответ на: комментарий от golodranez

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

parser ★★
()
Ответ на: комментарий от parser

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

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

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

golodranez ★★★★
() автор топика
Ответ на: комментарий от parser

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

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

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