Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-无需初始化对象即可访问类成员_Python - Fatal编程技术网

Python-无需初始化对象即可访问类成员

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

在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实例作为第一个参数调用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,但我不知道有这样的东西存在。:)@阿尔科:事实上,再考虑一下,你可以用其中任何一种。我已经删除了我先前的评论。