Форум сайта python.su
Уважаемые патйтонисты! Возникла идея сделать быстрый доступ к полю класса, которое то и дело меняется.
конструкция такова: cls.__connection__
Возможно ли сделать property для класса?
пробовал так:
@classmethod
@property
def data_manager(cls):
return cls.__connection__[cls.__objectname__]
cls.data_manager = property(...)
Офлайн
А зачем обязательно функцию data_manager делать функцией класса? Можно убрать декоратор @classmethod.
Или вам надо обращаться к этому полю в том числе и через имя класса?
Отредактировано (Окт. 1, 2010 06:15:56)
Офлайн
>>> class B(object):
... def __get__(self, a, A):
... if a is None:
... return 'B'
... return 'b'
>>> class A(object):
... b = B()
>>> A.b
'B'
>>> A().b
'b'
Отредактировано (Окт. 1, 2010 06:48:12)
Офлайн
Isem именно через имя класса надо
bw хитро, мудро, попробую заюзать, как просплюсь xD
спасибо огромное за ответы!
Офлайн
Тогда нужно создать свой собственный декоратор @classproperty :
class classproperty:
def __init__(self, getter):
self.__getter = getter
def __get__(self, inst, owner):
return self.__getter(owner)
class A:
_x = 10
@classproperty
def data_manager(cls):
return cls._x
>>> A.data_manager
10
>>> A().data_manager
10
Отредактировано (Окт. 1, 2010 10:21:32)
Офлайн
Isem годно, очень годно! спасибо!
Офлайн
хотя все только выглядело идеально:(
сделал как в примере
class classproperty:
def __init__(self, getter):
print 'init'
self.__getter = getter
def __get__(self, inst, owner):
print 'get'
return self.__getter(owner)
class ActiveRecord(object):
"""
"""
_test = 10
@classproperty
def data_manager(cls):
return cls._test
#все остальные строки в классе закоментил
>>> ActiveRecord._test
10
ActiveRecord.data_manager
<rcms.base.activerecord.classproperty instance at 0x7f8c6eb11d88>
Офлайн
class classproperty(object) :-) ?
..bw
Офлайн
HolyGeekНу что ж, надеюсь, время, все-таки, пропало не даром :)
Python 2.6.5
на Python 3.1 все нормально, но проект на 2.6 делается
5 часов просидел FFFFFFFFFUUUUUUU-
сделаю что-то на подобии как у bw
Офлайн