2017-06-22 24 views
-1

向元类添加一个方法在下面的例子中可以很好地工作。元类和方法

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) 
+5

您并未创建元类。你正在使用类型元类来生成一个普通类。 –

+0

你究竟在努力实现什么? – jonrsharpe

+0

“在下面的例子中,向元类添加一个方法完美。”这是不可能的,因为名称'triple'没有绑定任何东西,所以引用它会抛出一个'NameError'。 – jpmc26

回答

5

首先:你是不是创建元类,你正在创建普通班。 type()这里是(基本)元类,它调用它创建一个新的类对象(与class语句生成的对象类型相同)。

第一type()通话基本上等同于:

class TypeTest(Test) 
    triple = triple 
    quadruple = quadruple 

和第二个例子是一样的:

class Truck(Vehicle) 
    wheels = 4 
    door = True 
    load = 100 
    check_load = check_load 

你忘了创建Truck类的实例

Truck.check_load(10) 

这使得check_load()函数没有什么可绑定的,没有self

在你的第一个例子中,你创建一个实例:

TypeTest(2).quadruple() 

通知通话,传递2

创建self实例绑定到:

Truck(4, True).check_load(10) 

如果你想你的类不需要参数来创建一个实例,你需要提供不同的__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)