2017-02-09 39 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

相關問題