2017-02-09 25 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' - это то, где он должен быть, и я поместил аргумент в экземпляр фабрики. Эта ошибка связана с тем, как компиляция python или что-то еще? Я бегу python 3.5 на компьютере Windows 8.

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 

Таким образом, вы не имеете self (экземпляр), который myStr получил истолковано как.

0

При работе Check() по адресу cls.Check(myStr) вы пропустили спор. Check(self, myStr, *args, **kwargs) требует 2 аргумента, self и myStr. Поэтому для запуска Check(myStr) нужен второй аргумент, который по имени я принимаю self.