Python: замена метода в модуле календаря - PullRequest
2 голосов
/ 02 октября 2010

Я пытаюсь заменить два метода в модуле календаря:

import calendar


c = calendar.HTMLCalendar(calendar.MONDAY)
def ext_formatday(self, day, weekday, *notes):
    if day == 0:
        return '<td class="noday">&nbsp;</td>'
    if len(notes) == 0:
        return '<td class="%s">%d<br /></td>' % (self.cssclasses[weekday], day)
    else:
        return '<td class="%s">%d<br />%s</td>' % (self.cssclasses[weekday], day, notes)

def ext_formatweek(self, theweek, *notes):
    if len(notes) == 0:
        s = ''.join(self.formatday(d, wd) for (d, wd) in theweek)
    else:
        s = ''.join(self.formatday(d, wd, notes) for (d, wd) in theweek)
    return '<tr>%s</tr>' % s 

c.formatday = ext_formatday
c.formatweek = ext_formatweek

print c.formatmonth(2012,1,"foobar")

Это не сработает - кто-то может указать мне соответствующую литературу или указать, что я делаю неправильно?Я пытаюсь реализовать предложение Алана Хайнса из следующей ветки: ветка Мне уже слишком поздно думать прямо, и я больше часа танцую вокруг этой проблемы.

Заранее спасибо,
Якуб

Ответы [ 3 ]

1 голос
/ 02 октября 2010

Попробуйте заменить метод в классе вместо экземпляра.

Как это:

import calendar                                                                                                 


def ext_formatday(self, day, weekday, *notes):                                                                  
    if day == 0:                                                                                                
        return '<td class="noday">&nbsp;</td>'                                                                  
    if len(notes) == 0:                                                                                         
        return '<td class="%s">%d<br /></td>' % (self.cssclasses[weekday], day)                                 
    else:                                                                                                       
        return '<td class="%s">%d<br />%s</td>' % (self.cssclasses[weekday], day, notes)                        

def ext_formatweek(self, theweek, *notes):                                                                      
    if len(notes) == 0:                                                                                         
        s = ''.join(self.formatday(d, wd) for (d, wd) in theweek)                                               
    else:                                                                                                       
        s = ''.join(self.formatday(d, wd, notes) for (d, wd) in theweek)                                        
    return '<tr>%s</tr>' % s                                                                                    

calendar.HTMLCalendar.formatday = ext_formatday                                                                 
calendar.HTMLCalendar.formatweek = ext_formatweek                                                               

c = calendar.HTMLCalendar(calendar.MONDAY)                                                                      
print c.formatmonth(2012,1,"foobar")                                                                            
0 голосов
/ 02 октября 2010

Вы не хотите заменять методы;Алан Хайнс предложил подкласс HTMLCalendar:

class MyCustomCalendar(calendar.HTMLCalendar):

    def formatday(self, day, weekday, *notes):
        ...

    def formatweek(self, theweek, *notes):
        ...

c = MyCustomCalendar(calendar.MONDAY)

Это создаст новый производный класс (MyCustomCalendar), который наследует все методы и атрибуты HTMLCalendar, но определяет его собственные версии formatday и formatweek.

Подробнее о Inheritance вы можете прочитать в руководстве по Python или где-либо еще в Интернете.Это важный инструмент в Python (и объектно-ориентированного программирования в целом), и многие библиотеки созданы на его основе.

0 голосов
/ 02 октября 2010

Обновлен для использования types.MethodType, как предложил Аарон в комментариях.

Попробуйте:

import types
c.formatday = types.MethodType(ext_formatday, c, calendar.HTMLCalendar)

См. тип модуля документы. Чтобы понять, почему это не удалось:

In [53]: class A(object):
   ....:     def foo(self): pass

In [54]: def bar(self): pass

In [55]: a = A()

In [56]: a.foo
Out[56]: <bound method A.foo of <__main__.A object at 0x030D4770>>

In [57]: a.foo = bar

In [58]: a.foo
Out[58]: <function bar at 0x030C3EB0>

In [59]: aa = A()

In [60]: aa.foo.im_class, aa.foo.im_func, aa.foo.im_self
Out[60]:
(<class '__main__.A'>,
 <function foo at 0x030EE6F0>,
 <__main__.A object at 0x030D4910>)

In [61]: a.foo.im_class
AttributeError: 'function' object has no attribute 'im_class'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...