Python'un yöntem aşırı yüklemesini desteklemediğini biliyorum, ama güzel bir Pythonic şekilde çözemediğim bir sorunla karşılaştım.
Bir karakterin çeşitli mermileri vurması gereken bir oyun yapıyorum, ancak bu mermileri oluşturmak için nasıl farklı işlevler yazarım? Örneğin, A noktasından B noktasına belirli bir hızda hareket eden bir mermi oluşturan bir fonksiyonum olduğunu varsayalım. Ben böyle bir fonksiyon yazmak istiyorum:
def add_bullet(sprite, start, headto, speed):
... Code ...
Ama mermi oluşturmak için diğer işlevleri yazmak istiyorum:
def add_bullet(sprite, start, direction, speed):
def add_bullet(sprite, start, headto, spead, acceleration):
def add_bullet(sprite, script): # For bullets that are controlled by a script
def add_bullet(sprite, curve, speed): # for bullets with curved paths
... And so on ...
Ve birçok varyasyonda böyle devam eder. Bu kadar çok anahtar kelime argümanı kullanmadan yapmanın daha iyi bir yolu var mı? Her işlev yeniden adlandırma ya olsun, çünkü çok güzel feci olduğu add_bullet1
, add_bullet2
ya da add_bullet_with_really_long_name
.
Bazı yanıtları ele almak için:
Hayır Bullet sınıfı hiyerarşisi oluşturamıyorum çünkü bu çok yavaş. Madde işaretlerini yönetmek için gerçek kod C'dir ve işlevlerim C API etrafındaki paketleyicilerdir.
Anahtar kelime argümanlarını biliyorum ama her türlü parametre kombinasyonunu kontrol etmek can sıkıcı oluyor, ancak varsayılan argümanlar
acceleration=0
default value + if + else
C do ++ ile aynı yapmak. Bu C ++ 'nın Python'dan daha iyi okunabilirliğe sahip olduğu çok az şeyden biri ...
script, curve
, ortak bir ataları var mı, hangi yöntemleri destekliyorlar. Ördek yazmayla, sınıf tasarımını hangi yöntemleri desteklemeleri gerektiğini bulmak size kalmış. Muhtemelen Script
bir tür timestep tabanlı geri çağrıyı destekler (ancak hangi nesneye geri dönmeli? O zaman çizelgesindeki konum? O zaman çizelgesindeki yörünge?). Muhtemelen start, direction, speed
ve start, headto, spead, acceleration
her ikisi de yörünge türlerini açıklar, ancak yine de alıcı sınıfın nasıl paketleneceğini ve işleneceğini bilmesi size bağlıdır.