具有继承的元类

时间:2020-10-28 13:33:11

标签: python

我需要在旅途中创建类,这样我才能适应元类。

我有一个带有方法和__init__的主类。 我需要从这个主类创建一个类,因此我需要执行以下操作:

class main_class:
    def __init__(self, val1, val2):
      self.foo=val1
      self.bar=val2

my_new_class= type('new_class', (main_class,),{'foo':'new_foo'})
m = my_new_class("hello", world")
print(m.foo)
>>> hello

据我所知,main_class的init方法可能会超载my_new_class的属性。我没有找到一种方法来取代main_class中的 init

我想执行以下操作,但不对类进行硬编码:

class main_class:
    def __init__(self, val1, val2):
      self.foo=val1
      self.bar=val2

class new_class(main_class):
    def __init__(self, val1, val2, val3):
        super(main_class, self).__init__(val1=val1, val2=val2):
        self.foo=val3

2 个答案:

答案 0 :(得分:1)

您的示例中没有元类(内置type除外)。

但是,您误解了type()的第三个参数的作用。

new_class = type('new_class', (main_class,), {'foo':'new_foo'})

几乎等同于

class new_class(main_class):
    foo = 'new_foo'

–也就是说,它设置了一个类级别的变量,并且完全不涉及构造函数。

无论哪种方式,如果有帮助,您也可以在函数中定义一个类:

def make_class(val3_value):
    class new_class(main_class):
        def __init__(self, val1, val2, val3=val3_value):
            super().__init__(val1=val1, val2=val2)
            self.val3 = val3
    return new_class

答案 1 :(得分:0)

您可以使用__call__来获得元类的期望行为:

class MyMeta(type):
    def __call__(cls, val1, val2, val3):
        return super().__call__(val3, val2)

class new_class(main_class, metaclass=MyMeta):
    pass
相关问题