Python-无需初始化对象即可访问类成员
在Python模块“Wave”中,我可以使用以下语法:Python-无需初始化对象即可访问类成员,python,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 W
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实例作为第一个参数调用unbound方法Open()(改为获取str实例)
正如错误所述,您需要一个
Wave
类的实例来调用Open
方法。像这样的方法应该会奏效:
if Wave().Open("testing.wav", "rb"):
print "The file is open"
注意Wave
后面的括号-这就是创建新实例的原因
如果您希望能够在没有
Wave
类实例的情况下调用此方法,则可以将@staticmethod
装饰器添加到Open
函数中。这将允许您像在提供的代码中那样调用该方法。当错误状态出现时,您需要Wave
类的实例来调用Open
方法。像这样的方法应该会奏效:
if Wave().Open("testing.wav", "rb"):
print "The file is open"
注意Wave
后面的括号-这就是创建新实例的原因
如果您希望能够在没有
Wave
类实例的情况下调用此方法,则可以将@staticmethod
装饰器添加到Open
函数中。这将允许您像在提供的代码中那样调用该方法。要像这样调用它,您需要将打开
设置为静态方法:
@staticmethod
def Open(fileName, Type):
...
您的代码与开始时给出的示例之间的区别在于,
wave
是一个模块,wave
是一个类。您可以将Wave
转换为一个模块,并使Open
成为该模块中的顶级函数。要能够这样调用它,您需要将Open
设置为一个静态方法:
@staticmethod
def Open(fileName, Type):
...
您的代码与开始时给出的示例之间的区别在于,
wave
是一个模块,wave
是一个类。您可以将Wave
转换为一个模块,并使Open
成为该模块中的顶级函数。如果您希望您的Open方法是特定于类的,其他选项是@classmethod
decorator,即
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
另一个选项是
@classmethod
decorator,如果您希望您的open方法是特定于类的
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
Wave().Open(“testing.wav”,“rb”)
通过实例调用它,或者将Open
转换为classmethod。它是classmethod
而不是staticmethod
有一个很好的解释Wave().Open(“testing.wav”,“rb”)
通过实例调用它,或者将Open
转换为classmethod。这是一个classmethod
而不是staticmethod
有一个非常好的解释@NPE感谢我在学习Python,我不知道存在这样的东西。:)@阿尔科:事实上,再考虑一下,你可以用其中任何一种。我已经删除了我以前的评论。@NPE感谢我正在学习Python,但我不知道有这样的东西存在。:)@阿尔科:事实上,再考虑一下,你可以用其中任何一种。我已经删除了我先前的评论。