2008-11-29 12 views
15

: Bir dosya adı verilen bar.py sonraBir sınıf nesnesi bağlanmamış piton fonksiyonlarını saklamak Python aşağıdakileri yapmaya çalışıyorum

# simple function that does something: 
def myFunction(a,b,c): 
    print "call to myFunction:",a,b,c 

# class used to store some data: 
class data: 
    fn = None 

# assign function to the class for storage. 
data.fn = myFunction 

Ve:

bir dosya adı verilen foo.py olarak

:

: Ancak ithalat foo

d = foo.data 
d.fn(1,2,3) 

, aşağıdaki hatayı alıyorum 0

Bu yeterince adil - python d.myFunction bir sınıf yöntemi olarak davranıyor. Bununla birlikte, bunu normal bir işlev olarak ele almasını istiyorum - bu yüzden, myFunction tanımına kullanılmayan bir 'benlik' parametresi eklemeden onu çağırabilirim.

Yani soru şu:

bu sınıfın bağlı olma ben işlevi olmayan bir sınıf nesnesi bir fonksiyon kaydetmek nasıl?

+0

Kullanmak istediğinizi düşünüyorum: d.fn (1,2,3) ve d.myFunctions (1,2,3) –

+0

evet, d.fn() – hop

+1

anlamına geldiğini düşünüyorum. Çözüm aşağıdadır, ama neden bunu istiyorsun? – orip

cevap

23
data.fn = staticmethod(myFunction) 

hile yapmak gerekir.

+0

Bu işlev, başka bir yerde tanımlandığından doğru yanıt ve sözdizimi. – tzot

0

Bu bana anlamsız geliyor. İhtiyacınız olduğunda neden sadece işlevimi çağırmıyorsunuz?

Genel olarak, Python'da, bu tür ad boşlukları için modülleri kullanırız (Java ile bu seçeneği hiçbir zaman seçmediğiniz kontrast). Ve elbette, MyFunction tanımladığınızda modül ad alanına zaten bağlı. Tam olarak ne istediğinizi olmayabilir

d = foo.data() 
d.fn = myFunction 

d.fn(1,2,3) 

ama çalışır:

It is discussed somewhat in the answers to this question.

+0

Sanırım bir nesneye belirli bir işlevi ekleyebilir ve sonra nesnenin aradığı bazı işlevleri olan bir şeyi aramayı denemeniz gerekebilir. –

+0

OP'nin ne yaptığını yanlış anlamayın, bir örnek yöntem değil, bir sınıf yöntemi olduğunu fark etmedi. –

+0

Gerektiğinde çağırmak harikadır - ancak test yaparken, arama işlevini Mock yapmak isteyebilirsiniz - bu, işlevlerini çağırmak için üyelerinin kapsamını yakalamak zor olduğundan daha da zorlaşır. – Glycerine

1

Ne yapabilirsiniz olduğunu.

0

Cevap için Andre'ye teşekkürler - çok basit!

İlgilendiğiniz kişiler için belki de sorunun tüm bağlamını dahil etmeliydim. Burada yine de:

Uygulamamda, kullanıcılar eklentileri python'a yazabiliyorlar. İyi tanımlanmış bir parametre listesiyle bir işlev tanımlamalıdır, ancak üzerinde herhangi bir adlandırma kuralı uygulamak istemedim.

# this is my custom code - all plugins are called with a modified sys.path, so this 
# imports some magic python code that defines the functions used below. 
from specialPluginHelperModule import * 

# define the function that does all the work in this plugin: 
def mySpecialFn(paramA, paramB, paramC): 
    # do some work here with the parameters above: 
    pass 

# set the above function: 
setPluginFunction(mySpecialFn) 

çağrı:

So sürece kullanıcıların parametreleri ve türleri doğru sayı ile bir işlev yazarken, onlar tüm yapmanız gereken böyle bir şey (unutmayın, bu eklenti kodudur) 'dir setPluginFunction, işlev nesnesini alır ve onu gizli bir sınıf nesnesine ayarlar (diğer eklenti yapılandırmasıyla ilgili öğelerle birlikte, bu örnek bir şekilde basitleştirilmiştir). Ana uygulama işlevi çalıştırmak istediğinde, eklenti kodunu çalıştırmak için runpy modülünü kullanıyorum ve sonra yukarıda bahsedilen sınıf nesnesini ayıkladım - bu bana yapılandırma verilerini ve eklenti işlevini verir, böylece temiz bir şekilde çalıştırabilirim (kirletmeden) ad).

Tüm bu işlem, aynı giriş üzerinden farklı eklentiler için defalarca tekrarlanır ve benim için çok iyi çalışıyor gibi görünüyor.

+0

"tüm eklentiler, değiştirilmiş bir sys.path ile çağrılır" sys.path'i bir deneme/sonlandırma bloğunda geçici olarak mı değiştiriyorsunuz yoksa global sys.path'in "gölgelemesi" için bir yol var mı? – haridsv

+4

Lütfen ek bilgi eklemek için sorunuzdaki düzenle bağlantısını kullanın. Yanıtla butonu sadece soruya tam cevaplar için kullanılmalıdır. – cpburnz

İlgili konular