Найти - Пользователи
Полная версия: задачка с классами
Начало » Python для экспертов » задачка с классами
1
o7412369815963
# 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.
o7412369815963
пока выкрутился так - регистрирую статический метод который редиректит на реальный метод:
# 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')
ReinRaus
Попробуйте так
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')
>>>
o7412369815963
ReinRaus
Попробуйте так
class page(object):
я регистрирую метод add в одном из методов класса
    @classmethod
def reg(cls):
regmethod(_add)
поэтому он не становиться связным (“bound method”), и в итоге не работает.
ReinRaus
Тогда так
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')
>>>
o7412369815963
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')
ziro
Посмотрите здесь - https://github.com/nod/tornado_addons/blob/master/tornado_addons/route.py - кажется это похоже на то, что Вы хотите.

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