简体   繁体   中英

Python: Passing a class name as a parameter to a function?

class TestSpeedRetrieval(webapp.RequestHandler):
  """
  Test retrieval times of various important records in the BigTable database 
  """
  def get(self):
      commandValidated = True 
      beginTime = time()
      itemList = Subscriber.all().fetch(1000) 

      for item in itemList: 
          pass 
      endTime = time()
      self.response.out.write("<br/>Subscribers count=" + str(len(itemList)) + 
           " Duration=" + duration(beginTime,endTime)) 

How can I turn the above into a function where I pass the name of the class? In the above example, Subscriber (in the Subscriber.all().fetch statement) is a class name, which is how you define data tables in Google BigTable with Python.

I want to do something like this:

       TestRetrievalOfClass(Subscriber)  
or     TestRetrievalOfClass("Subscriber")  

Thanks, Neal Walters

class TestSpeedRetrieval(webapp.RequestHandler):
  """
  Test retrieval times of various important records in the BigTable database 
  """
  def __init__(self, cls):
      self.cls = cls

  def get(self):
      commandValidated = True 
      beginTime = time()
      itemList = self.cls.all().fetch(1000) 

      for item in itemList: 
          pass 
      endTime = time()
      self.response.out.write("<br/>%s count=%d Duration=%s" % (self.cls.__name__, len(itemList), duration(beginTime,endTime))

TestRetrievalOfClass(Subscriber)  

If you pass the class object directly, as in your code between "like this" and "or", you can get its name as the __name__ attribute.

Starting with the name (as in your code after "or") makes it REALLY hard (and not unambiguous) to retrieve the class object unless you have some indication about where the class object may be contained -- so why not pass the class object instead?!

A slight variation of Ned's code that I used. This is a web application, so I start it by running the get routine via a URL: http://localhost:8080/TestSpeedRetrieval . I didn't see the need of the init .

class TestSpeedRetrieval(webapp.RequestHandler):
  """
  Test retrieval times of various important records in the BigTable database 
  """
  def speedTestForRecordType(self, recordTypeClassname):
      beginTime = time()
      itemList = recordTypeClassname.all().fetch(1000) 
      for item in itemList: 
          pass # just because we almost always loop through the records to put them somewhere 
      endTime = time() 
      self.response.out.write("<br/>%s count=%d Duration=%s" % 
         (recordTypeClassname.__name__, len(itemList), duration(beginTime,endTime)))

  def get(self):

      self.speedTestForRecordType(Subscriber) 
      self.speedTestForRecordType(_AppEngineUtilities_SessionData) 
      self.speedTestForRecordType(CustomLog) 

Output:

Subscriber count=11 Duration=0:2
_AppEngineUtilities_SessionData count=14 Duration=0:1  
CustomLog count=5 Duration=0:2

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM