无需初始化对象的访问类成员
在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