Уведомления

Группа в Telegram: @pythonsu

#1 Март 6, 2011 23:29:02

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

задачка с классами

# coding: utf-8

class Page(object):
tpl = '/page'
@classmethod
def reg(cls):
def add(s):
return cls.tpl + s
from some import reg
reg(cls.add)

class Blog(Page):
tpl = '/blog'

Page.reg()
есть класс Page, в котором “регистрируется” метод add(s) при запуске, этот метод использует переменную из класса, метод должен быть статическим (вызывается из вне)
нужно унаследовать этот класс, с возможностью подменить метод add.

Офлайн

#2 Март 6, 2011 23:39:23

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

задачка с классами

пока выкрутился так - регистрирую статический метод который редиректит на реальный метод:

# coding: utf-8

_methods = []

def regmethod(method):
_methods.append(method)

class Page(object):
tpl = '/page/'
@staticmethod
def add(cls,s):
return cls.tpl + s
@classmethod
def reg(cls):
def _add(s):
return cls.add(cls,s)
#from some import reg
regmethod(_add)
print 'Page.reg'

class Blog(Page):
tpl = '/blog/'
@staticmethod
def add(cls,s):
return cls.tpl + 'foo/' + s

Blog.reg()
print _methods[0]('test')

Офлайн

#3 Март 16, 2011 18:54:05

ReinRaus
От:
Зарегистрирован: 2008-10-24
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

задачка с классами

Попробуйте так

class page(object):
tpl='page'
@classmethod
def add(cls, tpl): cls.tpl+=tpl

class blog(page):
add, tpl=None, 'blog'
@classmethod
def add(cls, tpl): cls.tpl+='++'+tpl

>>> page.tpl, blog.tpl
('page', 'blog')
>>> page.add, blog.add
(<bound method type.add of <class '__main__.page'>>, <bound method type.add of <class '__main__.blog'>>)
>>> page.add('sssss'), blog.add('dddd')
(None, None)
>>> page.tpl, blog.tpl
('pagesssss', 'blog++dddd')
>>>



Отредактировано (Март 16, 2011 18:57:47)

Офлайн

#4 Март 16, 2011 19:46:16

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

задачка с классами

ReinRaus
Попробуйте так
class page(object):
я регистрирую метод add в одном из методов класса
    @classmethod
def reg(cls):
regmethod(_add)
поэтому он не становиться связным (“bound method”), и в итоге не работает.

Офлайн

#5 Март 16, 2011 20:53:00

ReinRaus
От:
Зарегистрирован: 2008-10-24
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

задачка с классами

Тогда так

class page(object):
tpl='page'
@classmethod
def add(cls, tpl): cls.tpl+=tpl

class blog(page):
tpl='blog'
@classmethod
def reg(cls, func): cls.add=classmethod(func)

def test(cls, tpl): cls.tpl+='/+/'

>>> page.add('1')
>>> blog.add('2')
>>> page.tpl, blog.tpl
('page/1', 'blog/2')
>>> blog.reg(test)
>>> blog.add('3')
>>> page.add('4')
>>> page.tpl, blog.tpl
('page/1/4', 'blog/2/+/3')
>>>



Офлайн

#6 Март 16, 2011 21:28:02

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

задачка с классами

ReinRaus
Тогда так
тут метод подменяется не наследованием и вообще цель в другом.
есть массив _methods = , в методе page.reg нужно сделать добавления туда ф-ии blog.add -
вот типа этого (код для примера, не рабочий):
_methods = []

class page():
tpl = 'page'
def reg(cls):
_methods.append( cls.add )
class blog(page):
tpl = 'blog'
def add(self,msg):
return self.tpl+msg

blog.reg()
print _method[0]('hello')

Офлайн

#7 Март 18, 2011 09:07:46

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

задачка с классами

Посмотрите здесь - https://github.com/nod/tornado_addons/blob/master/tornado_addons/route.py - кажется это похоже на то, что Вы хотите.

Там надо будет заменить в 54 строке tornado.web.url на Вашу функцию для построения (типа klass.add(something)).



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version