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
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
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 */
...
teşekkür – user1200501
- 1. Neden staticmethod yerine classmethod kullanıyorsunuz?
- 2. Python'da "classmethod" ve "staticmethod" yöntemleri nasıl uygulanır?
- 3. Bir python @classmethod miras alınabilir mi? Örneğin
- 4. Zaten oluşturulan sınıf örneği setattr() python classmethod
- 5. Bir fonksiyonun @classmethod kullanıp kullanmadığını kontrol edin
- 6. django classonlymethod ve python classmethod arasındaki fark nedir?
- 7. @decorator neden bir staticmethod veya bir classmethod süslemez?
- 8. nasıl modül konumu
- 9. Kaydırma konumu> 100
- 10. MonoTouch: tmp klasörü konumu?
- 11. Sahnenin merkezi konumu
- 12. Windows'da BackgroundImage konumu
- 13. Python Kabuğundaki Metin Konumu
- 14. google infoBox konumu
- 15. AWS üzerinde savaş konumu
- 16. $ konumu karma önek
- 17. Linux Kernel Modülünün Konumu
- 18. Org Modunda Etiket Konumu
- 19. ios UIPanGestureRecognizer işaretçi konumu
- 20. UIButton TouchUpInside Dokunma Konumu
- 21. iOS: Sıralama konumu NSMutableArray
- 22. ImageView ve ayar konumu
- 23. Joomla PHP dosya konumu
- 24. JavaScript değişkenleri bellek konumu
- 25. C# XNA Fare Konumu
- 26. OrientDB coğrafi konumu
- 27. CKağıt yürütülebilir konumu
- 28. asgari yarıçap konumu
- 29. Sunucu konumu nasıl belirlenir?
- 30. Widget Önizleme konumu kaydet
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
\ _ \ _ call \ _ \ _ \ _ \ _ get \ _ \ _ yerine kullanılabilir mi? – DiogoNeves
tamam, açıklayıcılarla ilgili biraz bilgi okuduktan sonra şimdi mantıklı geliyor :) – DiogoNeves