Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> словарь или список public атрибутов объекта-класса 
:(
    Опции темы
pythonwin
Дата 2.2.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



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

для private атрибутов это __dict__ и через него можно обращаться к значению private-атрибута, как self.__dict__['name_attr']
PM WWW GTalk Jabber   Вверх
_Viper_
Дата 2.2.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 8.11.2006

Репутация: 10
Всего: 11



__dict__ содержит не только private аттрибуты, но и public.
PM MAIL   Вверх
pythonwin
Дата 2.2.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



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

спасибо!
PS глупый вопрос - сам нашел
PM WWW GTalk Jabber   Вверх
Daevaorn
Дата 2.2.2007, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



На самом деле поведение __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 )

PM MAIL WWW   Вверх
pythonwin
Дата 2.2.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



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 Частные атрибуты



PM WWW GTalk Jabber   Вверх
Daevaorn
Дата 2.2.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



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

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

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

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

Это оно, да?

Это сообщение отредактировал(а) Daevaorn - 2.2.2007, 15:20
PM MAIL WWW   Вверх
pythonwin
Дата 2.2.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(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 )

PM WWW GTalk Jabber   Вверх
Daevaorn
Дата 2.2.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



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

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

А вот так вообще не private получаетсяsmile
PM MAIL WWW   Вверх
J2A
Дата 2.2.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Ну __такие_переменные__ -- "магические" и их не рекомендуется на право и налево использовать.
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Daevaorn
Дата 2.2.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



Цитата(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__ остается с первоначальным. Интересно.
PM MAIL WWW   Вверх
pythonwin
Дата 2.2.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



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

почему?
PM WWW GTalk Jabber   Вверх
Daevaorn
Дата 2.2.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



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

служебные
PM MAIL WWW   Вверх
_Viper_
Дата 2.2.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 8.11.2006

Репутация: 10
Всего: 11



Цитата(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 = .... 
PM MAIL   Вверх
pythonwin
Дата 2.2.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



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

ну и использую их там где нужны защищенные атрибуты, чтобы использовать только в самом классе или в потомках
PM WWW GTalk Jabber   Вверх
Daevaorn
Дата 2.2.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



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

что в твоём понимании "защищенные"? Они же видны отовсюду!
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.