元类和方法
Metaclasses and methods
在下面的示例中,向元类添加方法非常有效。
class Test(object):
def __init__(self, x):
self.x = x
def double(self):
return self.x*2
# method to add
def quadruple(self):
return self.x*4
# creating metaclass
TypeTest = type('TypeTest', (Test,), {'triple': triple,
'quadruple': quadruple})
# prints 8
TypeTest(2).quadruple()
下面的例子不起作用,我不知道为什么。它根本无法识别已解析函数中的 self 并发生 TypeError。
class Vehicle(object):
def __init__(self, wheels, door=False):
self.wheels = wheels
self.door = door
# method to add
def check_load(self, x):
if x > self.load:
return "Load won't fit"
else:
return "Load will fit"
# creating metaclass
Truck = type('Truck', (Vehicle,), dict(wheels=4,door=True, load=100,
check_load=check_load))
# TypeError: check_load() missing 1 required positional argument: 'x'
Truck.check_load(10)
首先:您不是创建元class,您创建的是常规classes。 type()
是这里的(基础)元class,调用它会创建一个新的 class 对象(与 class
语句生成的对象类型相同)。
第一个 type()
调用本质上等同于:
class TypeTest(Test)
triple = triple
quadruple = quadruple
和第二个例子是一样的:
class Truck(Vehicle)
wheels = 4
door = True
load = 100
check_load = check_load
您忘记为您的 Truck
创建一个 实例 class:
Truck.check_load(10)
这使得 check_load()
函数没有任何绑定,没有 self
。
在您的第一个示例中,您确实创建了一个实例:
TypeTest(2).quadruple()
注意调用,传入 2
。
为 self
创建实例以绑定到:
Truck(4, True).check_load(10)
如果您希望 class 不需要参数来创建实例,您还需要提供另一种 __init__
方法,该方法会覆盖 Vehicle.__init__
方法:
def init(self): pass
Truck = type('Truck', (Vehicle,), dict(
wheels=4,door=True, load=100,
check_load=check_load, __init__=init))
现在您可以创建不带参数的实例:
Truck().check_load(10)
在下面的示例中,向元类添加方法非常有效。
class Test(object):
def __init__(self, x):
self.x = x
def double(self):
return self.x*2
# method to add
def quadruple(self):
return self.x*4
# creating metaclass
TypeTest = type('TypeTest', (Test,), {'triple': triple,
'quadruple': quadruple})
# prints 8
TypeTest(2).quadruple()
下面的例子不起作用,我不知道为什么。它根本无法识别已解析函数中的 self 并发生 TypeError。
class Vehicle(object):
def __init__(self, wheels, door=False):
self.wheels = wheels
self.door = door
# method to add
def check_load(self, x):
if x > self.load:
return "Load won't fit"
else:
return "Load will fit"
# creating metaclass
Truck = type('Truck', (Vehicle,), dict(wheels=4,door=True, load=100,
check_load=check_load))
# TypeError: check_load() missing 1 required positional argument: 'x'
Truck.check_load(10)
首先:您不是创建元class,您创建的是常规classes。 type()
是这里的(基础)元class,调用它会创建一个新的 class 对象(与 class
语句生成的对象类型相同)。
第一个 type()
调用本质上等同于:
class TypeTest(Test)
triple = triple
quadruple = quadruple
和第二个例子是一样的:
class Truck(Vehicle)
wheels = 4
door = True
load = 100
check_load = check_load
您忘记为您的 Truck
创建一个 实例 class:
Truck.check_load(10)
这使得 check_load()
函数没有任何绑定,没有 self
。
在您的第一个示例中,您确实创建了一个实例:
TypeTest(2).quadruple()
注意调用,传入 2
。
为 self
创建实例以绑定到:
Truck(4, True).check_load(10)
如果您希望 class 不需要参数来创建实例,您还需要提供另一种 __init__
方法,该方法会覆盖 Vehicle.__init__
方法:
def init(self): pass
Truck = type('Truck', (Vehicle,), dict(
wheels=4,door=True, load=100,
check_load=check_load, __init__=init))
现在您可以创建不带参数的实例:
Truck().check_load(10)