2009-09-17 17 views
24
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)) 

Yukarıdakileri, sınıfın adını geçtiğim bir işleve nasıl dönüştürebilirim? Yukarıdaki örnekte, Abone (Subscriber.all(). Getirme ifadesinde) bir sınıf adıdır; bu, Google BigTable ile Python'daki veri tablolarını nasıl tanımladığınızdır. Eğer " "böyle" arasında kodda olduğu gibi, doğrudan sınıf nesnesi geçmek ve varsaPython: Bir işlev için bir sınıf adını parametre olarak geçiriyor musunuz?

 TestRetrievalOfClass(Subscriber) 
or  TestRetrievalOfClass("Subscriber") 

sayesinde Neal Walters

cevap

17
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) 
+0

Serin, sana tıpkı diğer değişkenler gibi bir sınıf geçebileceği bilmiyordum. Bu bağlantıyı kaçırıyordum. – NealWalters

+7

işlevler, yöntemler, sınıf, modüller her şey python'da –

10

:

Böyle bir şey yapmak istiyorum veya " , adını __name__ özniteliği olarak alabilirsiniz. (Kodunuzdaki gibi sonra "veya") adıyla başlayarak

sınıf nesnesi bulunabilecek yerler hakkında bazı göstergeler var sürece gerçekten zor (ve kesin) sınıfı nesneyi almak için yapar - bu yüzden Bunun yerine sınıf nesnesini neden geçmiyorsunuz ?!

+1

+1'den geçebileceğiniz birinci sınıf bir nesnedir +1: Sınıflar birinci sınıf nesnelerdir - bunları değişkenlere ve parametrelere ve her şeye atayabilirsiniz. Bu C++ değil. –

+0

OBJ = globals() [className]() Burada className, sınıfın adının dizesini içeren değişkendir. Bunu eski bir gönderiden aldım: http://www.python-forum.org/pythonforum/viewtopic.php?f=3&t=13106 – NealWalters

+1

@NealWalters, eğer sınıf herhangi bir yerde ELSE tanımlanmışsa işe yaramaz - mevcut modülde (bir işlevde, başka bir sınıfta, başka bir modülde, vb.), genel olarak iyi bir fikir değil. –

1

Kullandığım Ned'in küçük bir değişkeni. Bu bir web uygulamasıdır, , böylece bir rutin URL'yi http://localhost:8080/TestSpeedRetrieval aracılığıyla çalıştırarak başladım. init'un gereksinimini görmedim.

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) 

Çıktı:

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