SORU
4 AĞUSTOS 2008, PAZARTESİ


Varolan bir Nesneye bir Yöntem ekleme

Varolan bir nesneyi (örneğin bir sınıf tanımı) için bir yöntem eklemek mümkün olduğunu okudumpythonBu Maymun Yama (ya da bazı durumlarda Ördek Delme) denir bence. Her zaman bunu yapmak için iyi bir karar olmadığını anlıyorum. Ama, bu nasıl olabilir?

8/04/2008 00:21:01 EST GÜNCELLEME:

That John Downey, ben denedim ama yok oluyor gibi görünüyor iyi bir cevap gibi görünüyordoğruyöntem. Senin örnek bir tartışma ile yeni bir yama işlevi tanımlarözama eğer yazdığınız gerçek kod bu şekilde, şimdi yamalı sınıf yöntemi sorar için bir argüman adında öz (değil otomatik olarak yüklenecektir tanıması olarak nesne olduğu sözde bağlamak, ne olurdu diye tanımlanan içinde sınıf tanımı), anlam aramalısınsınıf.yama(n)yerine sadecesınıf.() yamaaynı işlevi olarak bir istersenizdoğruyöntem.Python gerçekten bir yöntem olarak tedavi değil gibi görünüyor, ama daha sadece bir fonksiyonu olan bir değişken olarak(gibi çağrılabilir). Bir sınıf için gerçek bir yöntem eklemek için herhangi bir yolu var mı?

Oh, ve Ryan, that aradığım şey tam olarak bu değildi (işlevselliği yerleşik değil), ama oldukça serin bir şeydir.

CEVAP
6 AĞUSTOS 2008, ÇARŞAMBA


Python fonksiyonları ve sınır yöntemleri arasında bir fark yoktur.

>>> def foo():
...     print "foo"
...
>>> class A:
...     def bar( self ):
...         print "bar"
...
>>> a = A()
>>> foo
<function foo at 0x00A98D70>
>>> a.bar
<bound method A.bar of <__main__.A instance at 0x00A9BC88>>
>>>

Bağımlı yöntemler "" (ne kadar açıklayıcı bir örnek ve bu örnek yöntemi her çağrıldığında ilk argüman olarak kabul edilecektir. bağlanmış olmalı

Bir sınıf örneği (karşıt olarak) nitelikleri olan Callables istediğiniz zaman sınıf tanımını değiştirmek için hala ilişkisiz olsa da,:

>>> def fooFighters( self ):
...     print "fooFighters"
...
>>> A.fooFighters = fooFighters
>>> a2 = A()
>>> a2.fooFighters
<bound method A.fooFighters of <__main__.A instance at 0x00A9BEB8>>
>>> a2.fooFighters()
fooFighters

Önceden tanımlı (özniteliği geçersiz kendilerini alamadılar sürece):

>>> a.fooFighters()
fooFighters

Sorun tek bir örneği için bir yöntem eklemek istediğiniz zaman gelir:

>>> def barFighters( self ):
...     print "barFighters"
...
>>> a.barFighters = barFighters
>>> a.barFighters()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: barFighters() takes exactly 1 argument (0 given)

İşlevi doğrudan bir örneğini bağlı olduğu zaman otomatik olarak bağlı değildir

>>> a.barFighters
<function barFighters at 0x00A98EF0>

Bu büyüyü yapmak için MethodType function in the types module kullanabilirsiniz:

>>> import types
>>> a.barFighters = types.MethodType( barFighters, a )
>>> a.barFighters
<bound method ?.barFighters of <__main__.A instance at 0x00A9BC88>>
>>> a.barFighters()
barFighters

Bu sefer sınıfının diğer örneklerini etkilenmiş değil:

>>> a2.barFighters()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute 'barFighters'

Daha fazla bilgi descriptors 18* programming*hakkında okuyarak bulunabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Darren Kitchen

    Darren Kitch

    3 EKİM 2011
  • Fubar Protocol

    Fubar Protoc

    21 AĞUSTOS 2010
  • LatinNinja99

    LatinNinja99

    28 EKİM 2011