Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 14, 2008 10:43:45

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Еще про стиль написания программ.

vigorouz
перекрытие самого свойства решает проблему
Неа. Саму проблему это не решает, а лишь востанавливает поведение.



Офлайн

#2 Окт. 14, 2008 10:45:26

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Еще про стиль написания программ.

Ferroman
Да, абсолютно правильно, исправил.
Только у автора вопроса одно подчеркивание изначально:)



Офлайн

#3 Окт. 14, 2008 11:10:03

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще про стиль написания программ.

Да, я просто с примеров нокиевских брал некоторые моменты. там одно подчеркивание.



Отредактировано (Окт. 14, 2008 14:34:39)

Офлайн

#4 Окт. 14, 2008 13:11:29

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Еще про стиль написания программ.

неприятный момент при наследовании
Да, есть такое, весьма неприятно, если не знать о такой “особенности”. Может в 3000 будет логичнее этот момент.

Офлайн

#5 Окт. 14, 2008 18:57:13

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще про стиль написания программ.

а почему это нелогично? вроде все логично. property - объект который инициализируется при создании __класса__, а не при создании объекта.
вынести проперти в метакласс?

а по поводу первого вопроса, я думаю что, не стоит сильно лазить по чужим аттрибутам - нехорошо, для общения с другими классами - есть интерфейсы. если написать один геттер, сеттер - то ничего страшного тут еще нету, а если их становится целая куча - стоит подумать над тем - нахера нужен такой класс? ну это, конечно в простом случае ООП… но если еще строить архитектуру на таком - то можно задуматься над тем - а действительно ли оно надо?



Отредактировано (Окт. 14, 2008 18:59:38)

Офлайн

#6 Окт. 14, 2008 20:36:03

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Еще про стиль написания программ.

Не логично то, что property в примере тянет значение родительского класса, а не дочернего. То есть, для меня, более логичным было бы то, что при наследовании и перегрузке метода генерирующего property дочерним классом родительского метода, пр генерации property использовался бы новый метод, а не метод родителя.
Вот так:

class A(object):
def _get_name(self):
return 'A'
name = property(_get_name)

class B(A):
def _get_name(self): # перегружаем метод родительского класса
return 'B'

In: a.name
Out: 'A'

In: b.name
Out: 'В'

Офлайн

#7 Окт. 14, 2008 22:05:08

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Еще про стиль написания программ.

Легко сделать свою реализацию. Все помнят, что property - всего лишь пример тривиальнейшего дескриптора?

Хотя бы такую (внимание, набор юнит-тестов, естественно, далеко не полон, да и что ожидать от трехминутной работы…)

class dynamic_property(object):
'''property with lazy method binding'''
def __init__(self, getter, setter=None, deleter=None, doc=None):
self._getter_name = getter.__name__
self._setter_name = setter.__name__ if setter is not None else None
self._deleter_name = deleter.__name__ if deleter is not None else None
self.__doc__ = doc

def __get__(self, instance, owner):
assert instance is not None #like standard property
getter = getattr(owner, self._getter_name)
return getter(instance)

def __set__(self, instance, value):
setter = getattr(instance.__class__, self._setter_name)
return setter(instance, value)

def __delete__(self, instance):
deleter = getattr(instance.__class__, self._deleter_name)
return deleter(instance)


import unittest

class A(object):
val = None
def _get(self):
return 'A._get_'+str(self.val)

def _set(self, val):
self.val = val

def _del(self):
self.val = 'deleted'

prop = dynamic_property(_get, _set, _del, 'doc-string')

class B(A):
def _get(self):
return 'B._get_'+str(self.val)


class Test_dynamic_property(unittest.TestCase):
def setUp(self):
self.a = A()

def test_get(self):
self.assertEqual('A._get_None', self.a.prop)
self.a.val = 'val'
self.assertEqual('A._get_val', self.a.prop)

def test_set(self):
self.assertEqual('A._get_None', self.a.prop)
self.a.prop = 'val'
self.assertEqual('A._get_val', self.a.prop)

def test_set(self):
self.assertEqual('A._get_None', self.a.prop)
self.a.prop = 'val'
self.assertEqual('A._get_val', self.a.prop)

def test_del(self):
self.a.prop = 'val'
self.assertEqual('A._get_val', self.a.prop)
del self.a.prop
self.assertEqual('deleted', self.a.val)

def test_overload(self):
b = B()
self.assertEqual('B._get_None', b.prop)
b.val = 'val'
self.assertEqual('B._get_val', b.prop)

if __name__ == '__main__':
unittest.main()
Обратите внимание на цену перегрузки: функции getter-setter приходится искать каждый раз. Объект prop один-единственный для всей иерархии, A и B его разделяют. Поэтому работает чуть медленней стандартного.



Отредактировано (Окт. 14, 2008 22:12:45)

Офлайн

#8 Окт. 14, 2008 22:59:46

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Еще про стиль написания программ.

Отличный пример мощности языка :)
Просто хотелось бы что бы такой “сахар” работал сразу так, как ожидается.
Хоть я property не часто использую - но все равно очень интересно способ выводить такую бородавку :)

Офлайн

#9 Окт. 15, 2008 08:36:06

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще про стиль написания программ.

а если вообще делать через __getattr__/__setattr__? то есть заводить словарь внутри класса и проверять куда обращаются? это долго будет по времени? особенно если обращений к классу много.

вот тут у нокии есть классы, если я пытаюсь что-то изменить, что менять нельзя, у меня возникает ексепшн “рид онли фиелд”, а те, которые можно менять оно меняет и сразу меняет поведение объекта (вызывается функция-коллбэк моя), как это сделано? кроме вышеозначенных setattr и getattr есть способы?

идия с динамик проперти не плохо, но когда полей не много.

хм … может правда завести словарь. тогда потом проще будет добавлять новые свойства.



Офлайн

#10 Окт. 15, 2008 14:07:39

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще про стиль написания программ.

так он и так словарь =)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version