【问题标题】:Python Code wont Run giving unnecessary TypeError, not sure why?Python 代码不会运行给出不必要的 TypeError,不知道为什么?
【发布时间】:2017-02-09 00:17:22
【问题描述】:

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

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)

【问题讨论】:

  • 你把Check写成实例方法,但是你没有实例。

标签: python typeerror factory python-3.5


【解决方案1】:

您应该使用 @staticmethod 装饰器将 Check() 设为静态。也许@classmethod 也很有用。

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

这样你就没有myStr 被解释为的self(一个实例)。

【讨论】:

    【解决方案2】:

    cls.Check(myStr) 处运行Check() 时,您错过了一个参数。 Check(self, myStr, *args, **kwargs) 需要 2 个参数,selfmyStr。因此,运行Check(myStr) 需要第二个参数,我假设它的名称是self

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-08
      • 2013-09-08
      • 2017-04-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多