我需要在旅途中创建类,这样我才能适应元类。
我有一个带有方法和__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
答案 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