Модераторы: 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   Вверх
pythonwin
Дата 5.2.2007, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

а как создать атрибуты, которые доступны только изнутри?
подскажите, где можно почитать о "защищенных" атрибутах? (в книге Г.Россум "язык программирования python" не нашел)
PM WWW GTalk Jabber   Вверх
_Viper_
Дата 5.2.2007, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

В питоне нет стандартных "защищенных" атрибутов (аналога private в C++). Но в какой-то книге (к сожалению не помню в какой именно smile ) я встречал пример реализации такой задачи. Там она была реализована через использование ф-ций __getattr__  и __setattr__.
PM MAIL   Вверх
Daevaorn
Дата 5.2.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

по сути, кроме __name - других вариантов нет
PM MAIL WWW   Вверх
pythonwin
Дата 5.2.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

у Г.Россума описана это, правда в кратце.
PM WWW GTalk Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




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


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

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