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ış.
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ış.
"İş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))
:
İşteclass C:
def f(self): pass
>>> list(methods(C))
[<unbound method C.f>]
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
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())]))
, 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>]
Evet, ama bu Kendinizi Tekrar Etmeyin ilkesini ihlal ediyor. Ayrıca, istediği kodu kullanamaz veya gereksiz türler eklemek istemeyebilir. –
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. –
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
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
-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. –