【发布时间】:2021-02-21 11:24:21
【问题描述】:
我想强迫孩子调用父构造函数并找到this answer,这似乎可以很好地完成工作。但是,我有点不确定我所做的是否安全。我有这个:
# Copied from answer linked above
class meta(type):
def __init__(cls,name,bases,dct):
def auto__call__init__(self, *a, **kw):
for base in cls.__bases__:
base.__init__(self, *a, **kw)
cls.__init__child_(self, *a, **kw)
cls.__init__child_ = cls.__init__
cls.__init__ = auto__call__init__
# My code
import unittest
class TestBase(unittest.TestCase, metaclass=meta):
def __init__(self):
self.testvar="Hello, World!"
class A(TestBase):
def foo(self):
# Inherited from TestBase
print(self.testvar)
# Inherited from unittest.TestCase
self.assertEqual("Hello, World!", self.testvar)
A().foo()
这会打印“Hello, World!”正如预期的那样,我可以使用unittest.TestCase 中的assertEqual,但我有一种感觉,我可能在这里如履薄冰。这样做安全吗?它会以任何方式与unittest 发生冲突吗?
在原帖中,TestBase 没有继承自 unittest.TestCase。这就是区别。
【问题讨论】:
-
unittest 已经有关于自动运行类(以及它们的 init 方法)的特殊规则 - 所以要小心。您是否需要将其用于实际的“统一”事物或一般课程?
-
@jsbueno 它用于单元测试,但我将根据下面的答案跳过这个想法。
标签: python python-3.x inheritance metaclass