Найти - Пользователи
Полная версия: property для класса
Начало » Python для экспертов » property для класса
1
HolyGeek
Уважаемые патйтонисты! Возникла идея сделать быстрый доступ к полю класса, которое то и дело меняется.
конструкция такова: cls.__connection__
Возможно ли сделать property для класса?
пробовал так:
    @classmethod
@property
def data_manager(cls):
return cls.__connection__[cls.__objectname__]
невышло, говорит ‘property’ object is not callable, если поменять декораторы местами, то уже ‘classmethod’ object is not callable.
также пробовал сделать через метакласс
cls.data_manager = property(...)
тоде не вышло(при вызове метода, который есть у cls.__connection__, интерпретатор сказал, что объект property так не умеет)
Задача в общем не особо критичная, но вот для меня интересная
Isem
А зачем обязательно функцию data_manager делать функцией класса? Можно убрать декоратор @classmethod.
Или вам надо обращаться к этому полю в том числе и через имя класса?
bw
>>> 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'
..bw
HolyGeek
Isem именно через имя класса надо
bw хитро, мудро, попробую заюзать, как просплюсь xD
спасибо огромное за ответы!
Isem
Тогда нужно создать свой собственный декоратор @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
HolyGeek
Isem годно, очень годно! спасибо!
HolyGeek
хотя все только выглядело идеально:(
сделал как в примере
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>
Python 2.6.5
на Python 3.1 все нормально, но проект на 2.6 делается:(
5 часов просидел FFFFFFFFFUUUUUUU-
сделаю что-то на подобии как у bw :)
bw
class classproperty(object) :-) ?

..bw
Isem
HolyGeek
Python 2.6.5
на Python 3.1 все нормально, но проект на 2.6 делается
5 часов просидел FFFFFFFFFUUUUUUU-
сделаю что-то на подобии как у bw
Ну что ж, надеюсь, время, все-таки, пропало не даром :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB