问题描述
我正在学习 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)
1楼
您应该使用@staticmethod装饰器将Check() @staticmethod静态。
也许也很有用。
@staticmethod
def Check(myStr, *args, **kwargs):
# ...
pass
这样你就没有myStr被解释为的self (一个实例)。
2楼
在cls.Check(myStr)运行Check()时,您错过了一个参数。
Check(self, myStr, *args, **kwargs)需要 2 个参数, self和myStr 。
因此,运行Check(myStr)需要第二个参数,根据名称,我假设它是self 。