2016-03-30 3 views
3

Я уже прочитал this, но мне хотелось бы наследовать методы класса в параметре.Как передать класс как параметр и методы наследования

Пример:

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() 

Тогда из этого выше, как я мог бы сделать код такие вещи, как:

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

Я хочу быть как можно короче и легко понять в долгосрочной перспективе. 'a.game.get_max_players()' длиннее, чем 'a.get_max_players()' (и у меня много сравнений и т. д.) –

+1

Вам нужно будет реализовать '__getattr__', чтобы искать любые отсутствующие атрибуты на 'self.game'. Все это кажется немного назад - не должен ли 'TypeOfGame1' быть экземпляром или подклассом' Game'? – jonrsharpe

+0

Да, возможно, наследуется с классом 'Game (TypeOfGame1, TypeOfGame2)', а затем в зависимости от параметра конструктора выберите, какой вызов сделать? Если это возможно (я так думаю), я не знаю, как –

ответ

1

, если я правильно понимаю, как об использовании __getattr__ для прокси-сервера вашего класса?

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

Имеет ли это параметры прохождения? –

+0

передаст все неопределенные методы/атрибуты '__getattr__', так что да? – salparadise

1

Вы не можете сделать это, но вы можете использовать game объект вместо:

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

или реализовать методы в объекте game в качестве прокси-серверов в вашем Game класс:

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

Я хочу быть как можно короче и легко понять в долгосрочной перспективе. 'a.game.get_max_players()' длиннее, чем 'a.get_max_players()' (и у меня много сравнений и т. д.) –

+0

Или, может быть, наследовать с помощью класса 'Game (TypeOfGame1, TypeOfGame2)', а затем в зависимости по параметру конструктора, выберите, какой вызов сделать? Если это возможно (я так думаю), я не знаю, как –

+0

@OlivierPons. Если вы сделаете это короче, вы можете реализовать все методы, если они известны. См. Мой обновленный ответ. – Selcuk

Смежные вопросы