【发布时间】:2019-02-18 23:54:26
【问题描述】:
我们可以将函数用作元类,我的理解是它们不是从类型派生的,如下所示:
def test_meta(name, bases, atts):
print("testmeta called for " + name)
return type(name,bases,atts);
class Computer:
__metaclass__ = test_meta
def __init__(self,brand,model,price):
self.brand = brand
self.model = model
self.price = price
#
#
ob = Computer('p1','core2duo',21985.25)
但是,当我们编写元类时,它应该从类型继承,我无法理解这背后的原因:
class MyMeta:
def __new__(meta, name, bases, dct):
print ('-----------------------------------')
print ("Allocating memory for class", name)
print (meta)
print (bases)
print (dct)
return type.__new__(meta, name, bases, dct)
def __init__(cls, name, bases, dct):
print ('-----------------------------------')
print ("Initializing class", name)
print (cls)
print (bases)
print (dct)
type.__init__(cls,name, bases, dct)
def __call__(mcs, *args, **kwargs):
print ('-----------------------------------')
print ("calling class")
print mcs
class Computer:
__metaclass__ = MyMeta
def __init__(self,brand,model,price):
self.brand = brand
self.model = model
self.price = price
#
#
ob = Computer('p1','core2duo',21985.25)
例如在上面的代码中,当我们显式调用类型函数时,我无法理解为什么 MyMeta 类应该从 type 继承,即 新建、初始化、调用。 此外,只有在创建 i=instance (ob) 时才会出现错误“descriptor 'init' requires a 'type' object but received a 'instance'”。
【问题讨论】:
-
print(type(ob)) -> NoneType。你刚刚破坏了打字机中的某些东西。