三行代码  ›  专栏  ›  技术社区  ›  jameseosborne

为什么我的对象渲染函数不显示?

  •  0
  • jameseosborne  · 技术社区  · 2 月前

    因此,我目前正在用Python构建一个Html呈现程序,它使用两个基类:

    1. SingleTag-用于没有任何子项的标记,例如

      标签

    2. ContainingTag-用于具有嵌套标记的标记,例如Html标记、Div标记等。。。

    下面是包含这些类以及从它们继承的子类的文件:

    class ContainingTag:
        def __init__(self, children):
            self.open_tag = "<" + self.__class__.__name__.lower() + ">"
            self.close_tag = "</"+self.__class__.__name__.lower() + ">"
            self.children = children
    
        def render(self):
            print("\t" + self.open_tag)
            for child in self.children:
                print("\t \t" + str(child.render()))
            print("\t" + self.close_tag)
    
    class SingleTag:
        """A class to represent an html tag"""
    
        # Class initialiser
        def __init__(self, inner_html):
            self.open_tag = "<" + self.__class__.__name__.lower() + ">"
            self.close_tag = "</"+self.__class__.__name__.lower() + ">"
            self.inner_html = inner_html
    
        # Prints html
        def render(self):
            return self.open_tag + self.inner_html + self.close_tag
    
    class Html(ContainingTag):
        def __init__(self, children):
            super().__init__(children) 
            self.open_tag = "<!DOCTYPE html>\n"+ "<" + self.__class__.__name__.lower() + ">"
        
        def render(self):
            print(self.open_tag)
    
            for child in self.children:
                print("\t \t" + str(child.render()))
            print(self.close_tag)
    
    
    class Head(ContainingTag):
        def __init__(self, children):
            super().__init__(children)
    
    class Style(ContainingTag):
        def __init__(self, children):
            super().__init__(children)
    
    class Body(ContainingTag):
        def __init__(self, children):
            super().__init__(children)  
    
    class Div(ContainingTag):
        def __init__(self, children):
            super().__init__(children)
    
    class P(SingleTag):
        def __init__(self, inner_html=None):
            super().__init__(inner_html=None)
            self.inner_html = inner_html
    

    在SingleTag对象上使用render方法时,它会按预期进行渲染,但在ContainingTag上使用render方法时,它会在每个结束标记后打印“None”,如下所示:

    <Opening ContainingTag>
    <Closing ContainingTag>
    None
    

    有人能解释一下为什么会持续打印,以及如何修复吗?谢谢

    2 回复  |  直到 2 月前
        1
  •  0
  •   Anshumaan Mishra    2 月前

    错误似乎是 render 函数实际上不返回任何内容,因此默认值 None 被退回。

    def render(self):
            print(self.open_tag)
    
            for child in self.children:
                print("\t \t" + str(child.render()))
            print(self.close_tag)
            # Add a return statement
    
        2
  •  0
  •   gimix    2 月前

    更简单的方法是:

    • 覆盖内置的 __str__() 方法而不是创建 render
    • 将标记名作为参数传递给类构造函数,这样就不需要创建很多子类(您可能仍然希望创建一个 HTML 子类)
    class ContainingTag:
        def __init__(self, name, children):
            self.name = name
            self.children = children
    
        def __str__(self):
            return f'<{self.name}>\n' + ''.join([str(c) for c in self.children]) + f'</{self.name}>\n'
            
    class SimpleTag:
        def __init__(self, name, html):
            self.name = name
            self.html = html
    
        def __str__(self):
            return f'<{self.name}>{self.html}</{self.name}>\n'
    
    p1=SimpleTag('P', 'Hello')
    p2=SimpleTag('P', 'World')
    d=ContainingTag('DIV', [p1,p2])
    b=ContainingTag('BODY', [d])
    
    print(str(p1))
    <P>Hello</P>
    
    print(str(b))
    <BODY>
    <DIV>
    <P>Hello</P>
    <P>World</P>
    </DIV>
    </BODY>