2016-03-30 25 views
3

Zaten this okudum, ancak parametrede sınıf yöntemlerini miras almak istiyorum.Bir sınıfı parametre olarak geçirme ve yöntemleri devralma yöntemleri

Örnek: yapabileceğini nasıl yukarıdaki bu koddan Sonra

class TypeOfGame1(object): 
    def get_max_players(self): 
     return 2 

class TypeOfGame2(object): 
    def get_max_players(self): 
     return 30 

class Game(object): 
    def __init__(self, game_cls): 
     self.game = game_cls() 

şeyler gibi:

a = Game(TypeOfGame1) 
a.get_max_players() # should return 2 
a = Game(TypeOfGame2) 
a.get_max_players() # should return 30 
+0

Uzun vadede en kısa ve anlaşılması kolay olmak istiyorum. 'a.game.get_max_players()' 'a.get_max_players()' dan daha uzundur (ve çok fazla karşılaştırmaya sahibim ve devam ediyor) –

+1

Eksik özniteliklere bakmak için '__getattr__' öğesini uygulamanız gerekir. 'self.game'. Her şey biraz geri kalmış gibi görünüyor - TypeOfGame1 '' Game''in bir örneği mi yoksa alt sınıfı mı olmalı? – jonrsharpe

+0

Evet, belki de 'Game (TypeOfGame1, TypeOfGame2) 'sınıfıyla miras alınıyor ve sonra kurucunun parametresine bağlı olarak, hangi aramayı yapacağınızı seçin? Mümkünse (sanırım) –

cevap

1

nasıl proxy sınıfınızı __getattr__ kullanmaya ne dersiniz?

n [2]: class Game(object): 
    ...:  def __init__(self, game_cls): 
    ...:   self.game = game_cls() 
    ...:  def __getattr__(self, other): 
    ...:   return getattr(self.game, other) 
    ...: 

In [7]: g = Game(TypeOfGame1) 

In [8]: g.get_max_players() 
Out[8]: 2 

In [11]: g = Game(TypeOfGame2) 

In [12]: g.get_max_players() 
Out[12]: 30 
+0

Bu, parametreleri de iletiyor mu? –

+0

tüm tanımsız yöntemleri/öznitelikleri '__getattr__' için evet geçecek? – salparadise

1

Sen bunu yapamaz, ancak bunun yerine game nesneyi kullanabilirsiniz:

>>> a = Game(TypeOfGame1) 
>>> a.game.get_max_players() 
2 
>>> a = Game(TypeOfGame2) 
>>> a.game.get_max_players() 
30 

veya game nesnesindeki yöntemleri 0123'inizdeki proxy'ler olarak uygulayın.sınıfı: Eğer doğru anlamak

class Game(object): 
    ... 
    def get_max_players(self): 
     return self.game.get_max_players() 
+0

Uzun vadede en kısa ve anlaşılması kolay olmak istiyorum. 'a.game.get_max_players()' a.get_max_players() 'dan daha uzundur (ve ben çok fazla karşılaştırmalarm var ve devam ediyor) –

+0

Veya belki de 'Game (TypeOfGame1, TypeOfGame2)' sınıfı ile devralın Kurucu parametresinde hangi aramayı yapmalısınız? Eğer mümkünse (sanırım) –

+0

@OlivierPons'u nasıl kısaltacağımı bilemezseniz, tüm metodları biliniyorlarsa uygulayabilirsiniz. Güncellenmiş cevabımı görün. – Selcuk