无需初始化对象的访问类成员

在Python模块“Wave”中,我可以使用以下语法:

import wave
wave.open("test.wav", "rb")

这工作得很好。让我们说我想用我自己的类的初始化:

class Wave():

   def __init__(self):
       pass; 

   def Open(self, fileName, Type):
       return True; # Just testing 

现在,如果我有称为这个类的“主”,为什么我不能执行以下操作?:

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

TypeError:unbound方法必须使用Wave实例作为第一个参数调用Open()(取而代之的是str实例)


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

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

你的代码和你在开始时给出的例子之间的区别在于wave是一个模块, Wave是一个类。 您可以将Wave转换为模块,并将Open作为该模块中的顶级功能。


由于错误状态,您需要一个Wave类的实例来调用Open方法。 像这样的东西应该工作:

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

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

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


其他选项,如果你希望你的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
链接地址: http://www.djcxy.com/p/54291.html

上一篇: Access class member without initialization of object

下一篇: python local variables vs self