2012-02-12 22 views
7

Python kaynak kodunda bulunan dekoratör classmethod için kaynak kodu nerede. ancak aşağıda Saf Python ile yazılmış classmethod, bir dekoratör eşdeğer ne olabilir gösterir - - beri Özellikle ben 2.7.2@classmethod konumu

cevap

11

Sana ne sordu cevap vermeyeceğim sürümünde tanımlanan oluyor sorun tam dosyasını bulmakta yaşıyorum Mishna'nın cevabını yazdığı gibi, kaynak koddaki bir C, Python-2.7.2/Objects/funcobject.c'un içinde.

Öyleyse, sınıf yöntemleri fikri, Python's data model'da açıklandığı gibi "tanımlayıcı" mekanizmasını kullanmak ve __get__ yönteminin çağrıldığında, ilk yöntemle orijinal yöntemi çağıracak bir işlev nesnesi döndürmesini sağlamaktır.

class myclassmethod(object): 
    def __init__(self, method): 
     self.method = method 
    def __get__(self, instance, cls): 
     return lambda *args, **kw: self.method(cls, *args, **kw) 

Ve Python konsolu: argüman dolu önceden

>>> class MyClass(object): 
...  @myclassmethod 
...  def method(cls): 
...   print cls 
... 
>>> 
>>> m = MyClass() 
>>> m.method() 
<class '__main__.MyClass'> 
>>> 

* DÜZENLEME - Güncelleme *

O.P. ayrıca "Dekoratörün bir parametreyi kabul etmesini istediğimde, init için uygun formatın ne olacağını da sordu? "-

Bu durumda yalnızca değiştirilmesi gereken __init__ değil - yapılandırma parametrelerini kabul eden bir dekoratör aslında" iki aşamalı "olarak adlandırılır - ilki parametrelere açıklama ekleyebilir ve çağrılabilir bir döndürür - ikinci çağrı aslında dekore edilecek tek işlevi kabul

bunu yapmanın birkaç yolu vardır - ama en basit gibi yukarıdaki sınıf döndüren bir fonksiyona sahip olduğunu düşünüyorum içinde.

def myclasmethod(par1, par2, ...): 
    class _myclassmethod(object): 
     def __init__(self, method): 
      self.method = method 
     def __get__(self, instance, cls): 
      # make use of par1, par2,... variables here at will 
      return lambda *args, **kw: self.method(cls, *args, **kw) 
    return _myclassmethod 
+1

sınıfının doğru yeri için Dekoratörün bir parayı da kabul etmesini istedim metre init için uygun format ne olurdu? – user1200501

+0

\ _ \ _ call \ _ \ _ \ _ \ _ get \ _ \ _ yerine kullanılabilir mi? – DiogoNeves

+0

tamam, açıklayıcılarla ilgili biraz bilgi okuduktan sonra şimdi mantıklı geliyor :) – DiogoNeves

9
tar -zxf Python-2.7.2.tgz 
vim Python-2.7.2/Objects/funcobject.c 

... 
589 /* Class method object */ 
590 
591 /* A class method receives the class as implicit first argument, 
592 just like an instance method receives the instance. 
593 To declare a class method, use this idiom: 
594 
595  class C: 
596  def f(cls, arg1, arg2, ...): ... 
597  f = classmethod(f) 
598 
599 It can be called either on the class (e.g. C.f()) or on an instance 
600 (e.g. C().f()); the instance is ignored except for its class. 
601 If a class method is called for a derived class, the derived class 
602 object is passed as the implied first argument. 
603 
604 Class methods are different than C++ or Java static methods. 
605 If you want those, see static methods below. 
606 */ 
... 
+0

teşekkür – user1200501