Python - 无需初始化对象的Access类成员

时间:2013-11-12 11:22:44

标签: python

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

3 个答案:

答案 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