首页 > 解决方案 > 我们如何在仍然使用 `class` 关键字的同时覆盖构造函数?

问题描述

创建类的两种值得注意的方法如下所示:

class Klass:
    pass

Klass = type("Klass", tuple(), dict())

我想覆盖构造函数(__call__),同时仍然使用class关键字而不是做其他事情,比如直接调用type. 我真的想覆盖(__call__),而不是__init__

我的失败尝试如下所示:

尝试 1

class Foo:
    @classmethod
    def __call__(*args):
        print("arr har")
        return super(type(args[0]), args[0]).__call__(*args)

instance = Foo()
# did not print "arr har"

尝试 2

class BarMeta(type):
    def __call__(*args):
        print("hello world")
        return super(type(args[0]), args[0]).__call__(*args[1:])

标签: pythonpython-3.xmetaprogrammingmetaclassconstructor-overloading

解决方案


所有功劳都归功于Aran-Fey,他将答案作为评论发布,而不是作为答案:

class BarMeta(type):
    def __call__(*args):
        print("hello world")
        return super(type(args[0]), args[0]).__call__(*args[1:])    

class Bar(metaclass=BarMeta):
    pass

instance = Bar()

推荐阅读