2009-11-30 16 views
8

Ya da her şey bir yöntem midir? Her şey bir nesnedir yanaPython'da işlevler var mı?

, bir

def whatever: 

, değil file.py sadece bir yöntemdir?

+0

ve işlev ve yöntemlerin birbirleriyle eş anlamlı olduğunu düşündüm. – Amarghosh

+4

@Amarghosh: Hayır. Yöntemler, bir sınıfa bağlı tanımlayıcılardır. – nosklo

+1

Terminoloji inanıyorum diller arasında değişir - java her şey bir yöntemdir - statik veya örnek. – Amarghosh

cevap

31

Python'un işlevleri vardır. Her şey bir nesne functions are objects too olduğu gibi. biz bir işlevdir bir nesne oluşturduk def kullandığınızda

>>> def whatever(): 
...  pass 
... 
>>> whatever 
<function whatever at 0x00AF5F30> 

: Yani

, sizin örnek kullanmak. Biz, örneğin, nesnenin bir öznitelik bakabilirsiniz: cevap olarak

>>> whatever.func_name 
'whatever' 

Sorunuzun - whatever()değil bir yöntem file.py ait olduğunu. file.py genel ad alanında whatever adına bağlı bir işlev nesnesi olarak düşünmek daha iyidir.

>>> globals() 
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d 
oc__': None, 'whatever': <function whatever at 0x00AF5EB0>} 

Ya da başka bir açıdan bakmak, tamamen farklı bir nesneye ad whatever bağlama bizi durduramaz:

>>> whatever 
<function whatever at 0x00AF5F30> 
>>> whatever = "string" 
>>> whatever 
'string' 

fonksiyon nesneleri oluşturmak için başka yolları da vardır. Örneğin, için:

>>> somelambda = lambda x: x * 2 
>>> somelambda 
<function <lambda> at 0x00AF5F30> 

bir yöntem olup, bir fonksiyon, bir nesnenin öznitelik gibidir. Bunu bir yöntem kılan, yöntemlerin nesneye bağlı olmasıdır. Bu, nesnenin normalde self olarak adlandırdığımız ilk bağımsız değişken olarak işleve geçmesine neden olur.

>>> SomeClass.somemethod 
<unbound method SomeClass.somemethod> 
>>> someobject.somemethod 
<bound method SomeClass.somemethod of <__main__.SomeClass instance at 0x00AFE030 

Biz nesne üzerinde bir bağımlı yöntem olduğunu görebiliyorum:

>>> class SomeClass: 
...  def somemethod(one="Not Passed", two="Not passed"): 
...   print "one = %s\ntwo = %s" % (one,two) 
... 
>>> someobject = SomeClass() 

en öznitelik olarak somemethod bakalım:

en bir yöntem somemethod ve bir örneği someobject sahip bir sınıf SomeClass tanımlayalım ve sınıfta bir ilişkisiz yöntem. Yani şimdi en yöntemini çağırın ve ne olduğunu görelim:

>>> someobject.somemethod("Hello world") 
one = <__main__.SomeClass instance at 0x00AFE030> 
two = Hello world 

o somemethod tarafından alınan ilk argüman nesnesidir ve ikinci argüman yöntem çağrısında İlk argüman olan bir bağımlı yöntem var gibi. en sınıfına yöntemini çağırın bakalım: biz uygun türde bir nesne vermeden yöntemini çağırmak için çalışıyoruz çünkü

>>> SomeClass.somemethod("Hello world") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unbound method somemethod() must be called with SomeClass instance as first argument (got str instance instead) 

Python yakınıyor.Bu yüzden "elle" nesne geçirerek bu sorunu giderebilirsiniz:

>>> SomeClass.somemethod(someobject,"Hello world") 
one = <__main__.SomeClass instance at 0x00AFE030> 
two = Hello world 

Bu türde bir yöntem çağrıları kullanabilir - bir sınıf üzerinde bir yöntemi çağırma - Bir üst Belirli bir yöntemi çağırmak istediğinizde. Java Python bir dosya mutlaka senin kadar file denilen bir sınıf içermiyor file.py adlı aksine

(O take a function and bind it to class to make it a method mümkündür, ancak bu normalde hiç yapmanız gereken istediğiniz bir şey değildir.)

0

Hmm ... Dosya ad alanında sıradan bir işlev olarak "her türlü" ile çalışabilirsiniz.

2

Bu, file.java adlı bir java dosyası olsaydı beklenebilir.

Python'da bir dosya, bir sınıf değil, yalnızca bir ad alanı (Java sınıfından daha Java paketi ile karşılaştırılabilir) olan bir modüldür. file modülü/ad whatever_func isimli sıradan bir fonksiyonu ve bir yöntem whatever_meth sahip olan bir sınıf SomeClass içeren Yukarıdaki örnekte

def whatever_func(): 
    print "What ever function" 

class SomeClass(object): 
    def whatever_meth(self): 
     print "What ever method" 

: Bu örnek file.py düşünün.

İlgili konular