Access class member without initialization of object

In the Python module "Wave" I can use the following syntax:

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

This works perfectly fine.Let's say I wanted to use my own initialization of a class:

class Wave():

   def __init__(self):
       pass; 

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

Now If I have "main" which calls this class, why can't I do the following?:

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

TypeError: unbound method Open() must be called with Wave instance as first argument (got str instance instead)


To be able to call it like this you need to make Open a static method:

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

The difference between your code and the example you give at the start is that wave is a module, and Wave is a class. You could turn Wave into a module and have Open be a top-level function within that module.


As the error states, you need an instance of the Wave class to call the Open method. Something like this should work:

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

Note the parenthesis after Wave - that's what creates the new instance.

If you want to be able to call this method without having an instance of the Wave class you could add a @staticmethod decorator to the Open function. This will allow you to call the method as you do in the code you provided.


Other option, if you want your open method be class-specific, is @classmethod decorator, ie

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

and use as follows:

>>> 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/54292.html

上一篇: 教新手入门的最佳方法?

下一篇: 无需初始化对象的访问类成员