Python 代码不会运行,给出不必要的 TypeError,不知道为什么



我正在学习python,终于开始玩工厂了。下面的代码给了我以下错误,我不知道为什么。

Traceback (most recent call last):
  File "C:py_LabFactory.py", line 38, in <module>
    print(MyFactory("Ham").x)
  File "C:py_LabFactory.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)
您应该

使用@staticmethod装饰器使Check()静态。也许@classmethod也可能有用。

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

这样,您就不会myStr被解释为self(实例(。

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

相关内容

最新更新