2017-02-09 6 views
-1

저는 파이썬을 배우고 마침내 공장에서 놀고 있습니다. 아래 코드는 나에게 다음과 같은 오류를주고 있으며 나는 그 이유를 모른다.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'이 있어야하며 공장 인스턴스에 인수를 배치했는지 확신합니다. 이 오류는 파이썬이 컴파일하는 방식 때문에 발생합니까? 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

당신은 @staticmethod 장식과 Check() 정적해야한다. 어쩌면 @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이라고 가정합니다.