Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 1, 2010 05:39:12

HolyGeek
От:
Зарегистрирован: 2010-07-23
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

property для класса

Уважаемые патйтонисты! Возникла идея сделать быстрый доступ к полю класса, которое то и дело меняется.
конструкция такова: 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 так не умеет)
Задача в общем не особо критичная, но вот для меня интересная



Офлайн

#2 Окт. 1, 2010 06:15:15

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

property для класса

А зачем обязательно функцию data_manager делать функцией класса? Можно убрать декоратор @classmethod.
Или вам надо обращаться к этому полю в том числе и через имя класса?



Отредактировано (Окт. 1, 2010 06:15:56)

Офлайн

#3 Окт. 1, 2010 06:47:20

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

property для класса

>>> 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



Отредактировано (Окт. 1, 2010 06:48:12)

Офлайн

#4 Окт. 1, 2010 10:00:15

HolyGeek
От:
Зарегистрирован: 2010-07-23
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

property для класса

Isem именно через имя класса надо
bw хитро, мудро, попробую заюзать, как просплюсь xD
спасибо огромное за ответы!



Офлайн

#5 Окт. 1, 2010 10:18:04

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

property для класса

Тогда нужно создать свой собственный декоратор @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)

Офлайн

#6 Окт. 1, 2010 20:37:41

HolyGeek
От:
Зарегистрирован: 2010-07-23
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

property для класса

Isem годно, очень годно! спасибо!



Офлайн

#7 Окт. 1, 2010 22:56:15

HolyGeek
От:
Зарегистрирован: 2010-07-23
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

property для класса

хотя все только выглядело идеально:(
сделал как в примере

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 :)



Офлайн

#8 Окт. 2, 2010 00:19:48

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

property для класса

class classproperty(object) :-) ?

..bw



Офлайн

#9 Окт. 2, 2010 02:48:56

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

property для класса

HolyGeek
Python 2.6.5
на Python 3.1 все нормально, но проект на 2.6 делается
5 часов просидел FFFFFFFFFUUUUUUU-
сделаю что-то на подобии как у bw
Ну что ж, надеюсь, время, все-таки, пропало не даром :)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version