2014-01-09 2 views
1

Я создаю Настой сайт и я хочу, чтобы отобразить различные ссылки выхода из системы на основе текущей страницы т.е.Decorator Design Pattern в Python

  • Если мы на домашней странице и входа в систему, имеют ссылку завернуть в h2 тегах
  • Если мы на другой странице и входа в систему, имеют ссылку завернуть в подчеркиваний теги
  • Если вы вошли в систему, просмотреть ссылку, завернутые в сильных тегах

So у меня есть три до этого.

class HtmlLinks(): 
    html ="" 
    def set_html(self, html): 
     self.html = html 

    def get_html(self): 
     return self.html 

    def render(self): 
     print(self.html) 


class LogoutLink(HtmlLinks): 
    def __init__(self): 
     self.html = "Logout" 

class LogoutLinkH2Decorator(HtmlLinks): 
    def __init__(self, logout_link): 
     self.logout_link = logout_link 
     self.set_html("<h2> {0} </h2>").format(self.logout_link.get_html()) 

    def call(self, name, args): 
     self.logout_link.name(args[0]) 

class LogoutLinkUnderlineDecorator(HtmlLinks): 
    def __init__(self, logout_link): 
     self.logout_link = logout_link 
     self.set_html("<u> {0} </u>").format(self.logout_link.get_html()) 

    def call(self, name, args): 
     self.logout_link.name(args[0]) 

class LogoutLinkStrongDecorator(HtmlLinks): 
    def __init__(self, logout_link): 
     self.logout_link = logout_link 
     self.set_html("<strong> {0} </strong>").format(self.logout_link.get_html()) 

    def call(self, name, args): 
     self.logout_link.name(args[0]) 

logout_link = LogoutLink() 
is_logged_in = 0 
in_home_page = 0 

if is_logged_in: 
    logout_link = LogoutLinkStrongDecorator(logout_link) 
if in_home_page: 
    logout_link = LogoutLinkH2Decorator(logout_link) 
else: 
    logout_link = LogoutLinkUnderlineDecorator(logout_link) 

logout_link.render() 

Я получаю ошибку Атрибут

AttributeError: 'NoneType' object has no attribute 'format' 

Что плохого я делаю и как это исправить. Пожалуйста помоги.

+0

Похоже, вы ждете 'set_html 'иметь возвращаемое значение (отличное от' None')? Или, может быть, закрытие) слишком далеко влево. –

+0

Кроме того, вы не уверены в своем фоне, но у вас есть html как атрибут _class_. вы хотите, чтобы он был атрибутом _object_. для этого просто закомментируйте строку, которая говорит 'html =" "' .. –

+0

Спасибо @CorleyBrigman – ajkumar25

ответ

3

Так у вас есть несколько строк, выглядит следующим образом:

self.set_html("<h2> {0} </h2>").format(self.logout_link.get_html()) 

Вы, вероятно, хотите, чтобы выглядеть следующим образом:

self.set_html("<h2> {0} </h2>".format(self.logout_link.get_html())) 
1

set_html ничего не возвращает, но вы пытаетесь вызвать метод format по его возвращенному значению.

self.set_html("<strong> {0} </strong>").format(self.logout_link.get_html())