1

在 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 实例)

4

3 回答 3

4

为了能够像这样调用它,您需要创建Open一个静态方法:

@staticmethod
def Open(fileName, Type):
   ...

您的代码与您在开始时给出的示例之间的区别在于它wave是一个模块,并且Wave是一个类。您可以Wave变成一个模块并成为该模块Open中的顶级功能。

于 2013-11-12T11:25:52.467 回答
3

正如错误所述,您需要一个Wave类的实例来调用该Open方法。像这样的东西应该工作:

if Wave().Open("testing.wav", "rb"): 
   print "The file is open"

注意后面的括号Wave- 这就是创建新实例的原因。

如果您希望能够在没有Wave类实例的情况下调用此方法,则可以向函数添加@staticmethod装饰器Open。这将允许您像在提供的代码中一样调用该方法。

于 2013-11-12T11:25:46.250 回答
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
于 2013-11-12T11:41:28.370 回答