Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > словарь или список public атрибутов объекта-класса


Автор: pythonwin 2.2.2007, 14:12
Всем привет!
подскажите как назвается словарь или список - атрибут объекта, который содержит хотя бы имена public атрибутов объекта-класса?

для private атрибутов это __dict__ и через него можно обращаться к значению private-атрибута, как self.__dict__['name_attr']

Автор: _Viper_ 2.2.2007, 14:30
__dict__ содержит не только private аттрибуты, но и public.

Автор: pythonwin 2.2.2007, 14:34
Цитата(_Viper_ @  2.2.2007,  17:30 Найти цитируемый пост)
__dict__ содержит не только private аттрибуты, но и public. 

спасибо!
PS глупый вопрос - сам нашел

Автор: Daevaorn 2.2.2007, 14:51
На самом деле поведение __dict__ несколько странно на мой взгляд
Код

class Foo:
    bar_in_scope = 1
    
    def __init__(self ):
        self.bar_set = 2
        self.__bar_private = 3
    
f = Foo()

print f.__dict__
print dir( f )

Автор: pythonwin 2.2.2007, 15:14
Daevaorn, а вот так?

Код

class Foo:
    bar_in_scope = 1

    def __init__(self ):
        self.bar_set = 2
        self.__bar_private__ = 3

f = Foo()
print f.__dict__
print dir( f )


просто нужно имя private переменной описывать __имя__

Г.Россум и др. - Язык программирования Python
Цитата
9.6 Частные атрибуты



Автор: Daevaorn 2.2.2007, 15:19
Цитата(pythonwin @  2.2.2007,  16:14 Найти цитируемый пост)
а вот так?

я в reference читал про __name и если вызвать вне класса а.__bar_private, то эксепшен вылезает. Так что тут вроде всё нормально.
Я не понимаю другого, почему в f.__dict__ нет bar_in_scope?
Цитата

Г.Россум и др. - Язык программирования Python

Цитата 
9.6 Частные атрибуты 

Это оно, да?

Автор: pythonwin 2.2.2007, 16:18
Цитата(Daevaorn @  2.2.2007,  18:19 Найти цитируемый пост)
Это оно, да?

к сожелению у меня не стоят часть шрифтов - поэтому дал только заголовок
Цитата(Daevaorn @  2.2.2007,  18:19 Найти цитируемый пост)

я в reference читал про __name и если вызвать вне класса а.__bar_private, то эксепшен вылезает. Так что тут вроде всё нормально.

Traceback (most recent call last):
  File "<string>", line 74, in run_nodebug
  File "<Module1>", line 11, in ?
AttributeError: Foo instance has no attribute '__bar_private'


а вот так не ругается:
Код

class Foo:
    bar_in_scope = 1

    def __init__(self ):
        self.bar_set = 2
        self.__bar_private = 3
        self.__i1__='54'

f = Foo()
print f.__dict__
print f._Foo__bar_private
print dir( f )

Автор: Daevaorn 2.2.2007, 16:26
Цитата(pythonwin @  2.2.2007,  17:18 Найти цитируемый пост)
а вот так не ругается:

ну это логично.
Цитата(pythonwin @  2.2.2007,  16:14 Найти цитируемый пост)
просто нужно имя private переменной описывать __имя__

А вот так вообще не private получаетсяsmile

Автор: J2A 2.2.2007, 16:42
Ну __такие_переменные__ -- "магические" и их не рекомендуется на право и налево использовать.

Автор: Daevaorn 2.2.2007, 16:47
Цитата(J2A @  2.2.2007,  17:42 Найти цитируемый пост)
Ну __такие_переменные__ -- "магические" и их не рекомендуется на право и налево использовать. 

точно
Цитата(Daevaorn @  2.2.2007,  16:19 Найти цитируемый пост)
Я не понимаю другого, почему в f.__dict__ нет bar_in_scope?

Опытным путем определил, что bar_in_scope находится в f.__class__.__dict__. После первого же self.bar_in_cope = ... - она попадает в f.__dict__. При этом туда она идет с только что присвоиным значением, в __class__.__dict__ остается с первоначальным. Интересно.

Автор: pythonwin 2.2.2007, 16:55
Цитата(J2A @  2.2.2007,  19:42 Найти цитируемый пост)
Ну __такие_переменные__ -- "магические" и их не рекомендуется на право и налево использовать. 

почему?

Автор: Daevaorn 2.2.2007, 16:57
Цитата(pythonwin @  2.2.2007,  17:55 Найти цитируемый пост)
почему? 

служебные

Автор: _Viper_ 2.2.2007, 17:18
Цитата(Daevaorn @  2.2.2007,  16:47 Найти цитируемый пост)
Опытным путем определил, что bar_in_scope находится в f.__class__.__dict__. После первого же self.bar_in_cope = ... - она попадает в f.__dict__. При этом туда она идет с только что присвоиным значением, в __class__.__dict__ остается с первоначальным. Интересно.

bar_in_cope - в твоём случае аттрибут класса, а не обьекта. А после присваивания создаётся аттрибут обьекта. 
Для изменения аттрибута класса к нему надо обрашаться так: self.__class__.bar_in_cope = .... 

Автор: pythonwin 2.2.2007, 17:27
Цитата(Daevaorn @  2.2.2007,  19:57 Найти цитируемый пост)
служебные 

ну и использую их там где нужны защищенные атрибуты, чтобы использовать только в самом классе или в потомках

Автор: Daevaorn 2.2.2007, 17:35
Цитата(pythonwin @  2.2.2007,  18:27 Найти цитируемый пост)
ну и использую их там где нужны защищенные атрибуты

что в твоём понимании "защищенные"? Они же видны отовсюду!

Автор: pythonwin 5.2.2007, 09:25
Цитата(Daevaorn @  2.2.2007,  20:35 Найти цитируемый пост)
что в твоём понимании "защищенные"? Они же видны отовсюду! 

да... вот я дал маху - прошу прощения ;(

а как создать атрибуты, которые доступны только изнутри?
подскажите, где можно почитать о "защищенных" атрибутах? (в книге Г.Россум "язык программирования python" не нашел)

Автор: _Viper_ 5.2.2007, 11:50
Цитата(pythonwin @  5.2.2007,  09:25 Найти цитируемый пост)
а как создать атрибуты, которые доступны только изнутри?подскажите, где можно почитать о "защищенных" атрибутах? (в книге Г.Россум "язык программирования python" не нашел)

В питоне нет стандартных "защищенных" атрибутов (аналога private в C++). Но в какой-то книге (к сожалению не помню в какой именно smile ) я встречал пример реализации такой задачи. Там она была реализована через использование ф-ций __getattr__  и __setattr__.

Автор: Daevaorn 5.2.2007, 12:05
Цитата(pythonwin @  5.2.2007,  10:25 Найти цитируемый пост)
 как создать атрибуты, которые доступны только изнутри?

по сути, кроме __name - других вариантов нет

Автор: pythonwin 5.2.2007, 12:32
Цитата(_Viper_ @  5.2.2007,  14:50 Найти цитируемый пост)
Но в какой-то книге (к сожалению не помню в какой именно smile ) я встречал пример реализации такой задачи. Там она была реализована через использование ф-ций __getattr__  и __setattr__. 

у Г.Россума описана это, правда в кратце.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)