gpt4 book ai didi

python - 使用 super().__init__() 混合 type() 和自定义 __init__()

转载 作者:行者123 更新时间:2023-11-28 21:47:11 25 4
gpt4 key购买 nike

到目前为止我已经成功地做了什么:

我创建了一个 elem 类来表示 html 元素(divhtmlspanbody 等)。

我可以像这样派生这个类来为每个元素创建子类:

class elem:
def __init__(self, content="", tag="div", attr={}, tag_type="double"):
"""Builds the element."""
self.tag = tag
self.attr = attr
self.content = content
self.tag_type = tag_type

class head(elem):
"""A head html element."""

def __init__(self, content=None, **kwargs):
super().__init__(tag="head", content=content, **kwargs)

而且效果很好。

但是我必须为每个子类声明都写这个,如果我想为每个 HTML 标记类型都写,那是相当重复和多余的。

所以我试图创建一个 make_elem() 函数,通过将相应的标签名称作为字符串参数来创建我的类。

所以我会简单地使用这样的东西来代替以前的类定义:

head = make_elem_class("head")

我卡在哪里

这个函数应该创建一个类。并且此类的 __init__() 方法应该从它继承的类中调用 __init__() 方法。

我尝试制作这个 make_elem_class() 函数,它看起来像这样:

def make_elem_class(name):
"""Dynamically creates the class with a type() call."""

def init(self, content=None, **kwargs):
super().__init__(tag=name, content=None, **kwargs)

return type(name, (elem,), {"__init__" : init})

但是当运行 html = make_elem_class('html'),然后 html("html element") 我得到以下错误:

Traceback (most recent call last):
File "elements.py", line 118, in <module>
html("html element")
File "elements.py", line 20, in init
super().__init__(tag=name, content=None, **kwargs)
TypeError: object.__init__() takes no parameters

我猜它与空的 super() 调用有关,所以我尝试使用 super(elem, self) 代替。但它显然并没有更好地工作。

我怎样才能做到这一点?

注意: 如果我从 type() 调用的字典中删除 "__init__":init,它工作正常,但我的元素中的标签设置不正确。我也试过直接将 {"tag":name} 传递给 type() 但它也没有用。

最佳答案

你不能在这里使用 super() 的无参数形式,因为这里没有 class 语句来提供该函数通常需要的上下文。

或者更确切地说,除非您自己提供该上下文,否则您不能;您需要在此处将名称 __class__ 设置为闭包:

def make_elem_class(name):
"""Dynamically creates the class with a type() call."""

def init(self, content=None, **kwargs):
super().__init__(tag=name, content=content, **kwargs)

__class__ = type(name, (elem,), {"__init__" : init})
return __class__

super() 会自动从闭包中获取 __class__ 值。请注意,我将 content 的值(而不是 None)传递给 elem.__init__ 方法;你不想失去那个值(value)。

如果那是 too magical对你来说,在调用 super() 时明确命名类和 self;同样,该类将从闭包中获取:

def make_elem_class(name):
"""Dynamically creates the class with a type() call."""

def init(self, content=None, **kwargs):
super(elemcls, self).__init__(tag=name, content=content, **kwargs)

elemcls = type(name, (elem,), {"__init__" : init})
return elemcls

关于python - 使用 super().__init__() 混合 type() 和自定义 __init__(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36890291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com