python - 我们如何在仍然使用 `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:])
尝试 2A
class Bar: __metaclass__ = BarMeta instance = Bar() # did not print "hello world"
尝试 2B
Baz = BarMeta("Baz", tuple(), dict()) instance = Baz() # Did print "hello world," but we weren't able to use the `class` keyword to create `Baz`
解决方案
所有功劳都归功于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()
推荐阅读
- arrays - 如何将数组发送到函数中
- java - 在java中使用单栈实现队列
- c# - 什么是上下文?如何将嵌入对象发送到 webhook?
- facebook - 从私人 Facebook 群组中抓取电子邮件
- javascript - Firebase 函数:无法读取未定义的属性 https
- google-analytics - 未从 Hit Builder 记录 Google Analytics Standard 电子商务数据
- javascript - 儿童道具未更新
- asp.net - 检查gridview控件内下拉列表中的重复值
- c# - 我们能否构建一个自定义登录页面来将用户名和密码发送到 AD FS 2016 而不是使用 OOB 页面
- google-contacts-api - Google Calendar API 令牌访问