2017-02-09 86 views
-1

我正在学python,终于到处玩弄工厂。下面的代码给了我下面的错误,我不知道为什么。Python代码不会运行给不必要的TypeError,不知道为什么?

Traceback (most recent call last): 
    File "C:\py_Lab\Factory.py", line 38, in <module> 
    print(MyFactory("Ham").x) 
    File "C:\py_Lab\Factory.py", line 30, in MyFactory 
    if cls.Check(myStr): 
TypeError: Check() missing 1 required positional argument: 'myStr' 

工厂定义是通过基类的子类假设循环并使用在子类的定义Check()选择运行哪个类。我很确定参数'myStr'是它应该在的位置,并且我在工厂的实例中发了一个参数。这是由于python编译的方式吗?我在Windows 8电脑上运行python 3.5

class BaseClass(object): 
    pass 

class AltBaseClass(object): 
    pass 

class C1(BaseClass, AltBaseClass): 
    def __init__(self, *args, **kwargs): 
     self.x = 1 
    def Check(self, myStr, *args, **kwargs): 
     return myStr == "Ham" 

class C2(BaseClass, AltBaseClass): 
    def __init__(self, *args, **kwargs): 
     self.x = 30 
    def Check(self, myStr, *args, **kwargs): 
     return myStr == "Sandwich" 

class C3(BaseClass, AltBaseClass): 
    def __init__(self, *args, **kwargs): 
     self.x = 70 
    def Check(self, myStr, *args, **kwargs): 
     return myStr == "Pancake" 

def MyFactory(myStr): 
    for cls in BaseClass.__subclasses__(): 
     if cls.Check(myStr): 
      return cls() 

def OthrFactory(myStr): 
    for cls in AltBaseClass.__subclasses__(): 
     if cls.Check(myStr): 
      return cls() 

print(MyFactory("Ham").x) 
print(OthrFactory("Sandwich").x) 
print(OthrFactory("Pancake").x) 
+0

你已经写了'Check'作为一个实例方法,但你没有一个实例。 – user2357112

回答

0

你应该让Check()静态与@staticmethod装饰。也许@classmethod也可能是有用的。

@staticmethod 
def Check(myStr, *args, **kwargs): 
    # ... 
    pass 

myStr得到解释为这样你就没有self(实例)。

0

当运行Check()cls.Check(myStr)时,您错过了一个参数。 Check(self, myStr, *args, **kwargs)需要2个参数,selfmyStr。因此,运行Check(myStr)需要第二个参数,其名称我认为是self

相关问题