2009-04-13 15 views
5

Python'da her işlevin bir sınıf içinde çalıştırılması mümkün mü?Python içindeki sınıftaki her işlev için

DÜZENLEME: Ne yapmam çalışıyorum bir sınıf içerisindeki fonksiyonların çağrıdır, onların dönüş değişkenleri toplamak öyle çalış.

cevap

3

"İşlev" ile ne kastettiğinize bağlıdır. Böyle bir şey olsa da, işe yarayabilir: Sonra

import inspect 

def methods(c): 
    return (m for m in (getattr(c, d) for d in dir(c)) 
      if inspect.ismethoddescriptor(m) or inspect.ismethod(m)) 

:

İşte
class C: 
    def f(self): pass 

>>> list(methods(C)) 
[<unbound method C.f>] 
+0

-1 ile başlayan herhangi bir cur_method_name'u atlamak isteyebilirsiniz. Tüm ifadeyi, döndürme ifadesi oluşturmada tamamen okunamaz durumda tutmak için. –

4

Evet, yapabilirsiniz. Hızlı ve kirli: Bir daha rafine bir kavram istiyorsanız, unittest.py modülünü kontrol

class foo: 
    def one(self): 
     print "here is one" 
    def two(self): 
     print "here is two" 
    def three(self): 
     print "here is three" 


obj = foo() 
for entry in dir(obj): 
    print entry, callable(getattr(obj,entry)) 
    if callable(getattr(obj,entry)): 
     getattr(obj,entry)() 

. "Test" dizgisi ile başlayan tüm yöntemleri yürüten bir kod bulunmalıdır

1

sınıfında fonksiyonlar döngü verim kullanan biridir. Sınıfa yazdıktan sonra

def get_functions(mod): 
    for entry in dir(mod): 
     obj=getattr(mod,entry); 
     if hasattr(obj, '__call__') and hasattr(obj,'__func__') : 
      yield obj 

class foo: 
    def one(self): 
     print ("here is two") 
     return 1 
    def two(self): 
     print ("here is two") 
     return 2 
    def three(self): 
     print ("here is three") 
     return 3 


print(sum([fun() for fun in get_functions(foo())])) 
1

, zaten tüm fonksiyonları biliyorum.

class ThisIsPeculiar(object): 
    def aFunction(self, arg1): 
     pass 
    def anotherFunction(self, thisArg, thatArg): 
     pass 
    functionsToCall = [ aFunction, anotherFunction ] 

>>> p= ThisIsPeculiar() 
>>> p.functionsToCall 
[<function aFunction at 0x6b830>, <function anotherFunction at 0x6b870>] 
+0

Evet, ama bu Kendinizi Tekrar Etmeyin ilkesini ihlal ediyor. Ayrıca, istediği kodu kullanamaz veya gereksiz türler eklemek istemeyebilir. –

+0

KURUYU benim için ihlal etmiyor gibi görünüyor. Otomagically denilen istemediğiniz yöntemlere kolayca sahip olabilirsiniz. Bu, çağrılan yöntemlerin listesini pozitif olarak tanımlar. –

1

inspect module kullanmayı deneyin:

import inspect 

class Spam: 
    def eggs(self): 
     print "eggs" 
    def ducks(self): 
     print "ducks" 
    value = "value" 

spam = Spam() 
for name, method in inspect.getmembers(spam, callable): 
    method() 

Çıktı:

ducks 
eggs 
3

dir builtin örneğin, bir nesnenin tüm özelliklerini listeler:

>>> class MyClass: 
...  def one(self): 
...   print "one" 
...  def two(self): 
...   print "two" 
...  def three(self): 
...   print "three" 
... 
>>> dir(MyClass) 
['__doc__', '__module__', 'one', 'three', 'two'] 

I t da

>>> c = MyClass() 
>>> dir(c) 
['__doc__', '__module__', 'one', 'three', 'two'] 

Yöntemleri sadece (c.attribute() aracılığıyla) çağrılabilir olarak gerçekleşmesi hangi özellikleridir .. bir Başlatıldı sınıfın üzerinde çalışır - bir değişkeni yoluyla bu yöntemi başvurmak için getattr işlevini kullanabilirsiniz ..

>>> myfunc = getattr(c, 'one') 
>>> myfunc 
<bound method MyClass.one of <__main__.MyClass instance at 0x7b0d0>> 

Sonra sadece o değişkeni çağırabilir ..

>>> myfunc() 
one # the output from the c.one() method 

bazı nitelikler fonksiyonları yukarıdaki örnekte (olmadığından, __doc__ ve __module__). Yani

>>> callable(c.three) 
True 
>>> callable(c.__doc__) 
False 

bir döngüye tüm bu birleştirmek: bir çağrılabilir yöntemi (bir fonksiyonu) ise biz kontrol etmek bize callable builtin olabilir, bu yine __init__ gibi yöntemler arayacak hatırla

>>> for cur_method_name in dir(c): 
...  the_attr = getattr(c, cur_method_name) 
...  if callable(the_attr): 
...    the_attr() 
... 
one 
three 
two 

hangi Muhtemelen arzu edilmez.Bir alt çizgi

İlgili konular