在Python模块“Wave”中,我可以使用以下语法:
import wave
wave.open("test.wav", "rb")
这完全正常。但是我想我想使用我自己的类初始化:
class Wave():
def __init__(self):
pass;
def Open(self, fileName, Type):
return True; # Just testing
现在如果我有“main”调用此类,为什么我不能执行以下操作?:
if Wave.Open("testing.wav", "rb"):
print "The file is open"
TypeError:未绑定方法必须使用Wave实例作为第一个参数调用Open()(改为使用str实例)
答案 0 :(得分:4)
为了能够像这样调用它,你需要使Open
成为一个静态方法:
@staticmethod
def Open(fileName, Type):
...
您的代码与您在开始时提供的示例之间的区别在于wave
是一个模块,Wave
是一个类。您可以将Wave
转换为模块,并使Open
成为该模块中的顶级函数。
答案 1 :(得分:3)
如错误所述,您需要Wave
类的实例来调用Open
方法。这样的事情应该有效:
if Wave().Open("testing.wav", "rb"):
print "The file is open"
请注意Wave
之后的括号 - 这就是创建新实例的内容。
如果您希望能够在没有Wave
类实例的情况下调用此方法,则可以向@staticmethod
函数添加Open
装饰器。这将允许您像在提供的代码中一样调用该方法。
答案 2 :(得分:3)
其他选项,如果你希望你的open方法是特定于类的,那就是@classmethod
装饰器,即
class Wave():
def __init__(self):
pass;
@classmethod
def open(cls, filename):
print '{}.open method with args "{}"'.format(cls, filename)
return True; # Just testing
class SubWave(Wave): pass
并使用如下:
>>> Wave.open('filename')
__main__.Wave.open method with args "filename"
True
>>> SubWave.open('filename')
__main__.SubWave.open method with args "filename"
True