2012-03-14 3 views
0

Я пытаюсь переписать код javascript в Python. Это создает некоторые проблемы, так как я довольно новичок в python, но это хороший экзамен, который я считаю.Динамические методы Python

Во всяком случае, проблема под рукой, что мне нужно динамические методы объекта, которые определены где-нибудь еще ... (я знаю, как это звучит, но терпите меня на секунду)

Основном есть Плитка объект, который может быть несколько типов плитки, но вместо того, чтобы эти типы степени основной плитки опротестовать выбор был сделан, чтобы поставить функциональность в некий массив,

tileTypes = { 
    1: { 
     color: red, 
     func: dynamic_function(){ 
      //code here 
     } 
    }, 
    2: { 
     color: green, 
     func: dynamic_function(){ 
      //other code here 
     } 
    }, 
} 

var Tile = function(type) 
{ 
    this.color = tileTypes[type].color 
    this.func = tileTypes[type].func 
} 

(код реальной жизни намного более крупный, чем это, но в качестве примера служит его назначение)

Я знаю, что это не самый приятный код (он чувствует себя действительно странно, как это), но он очень динамичен, и новые типы могут быть добавлены очень быстро, поэтому я прощаю.

Однако я не знаю, как это сделать в python.

ПРИМЕЧАНИЕ: Я, скорее всего, не буду использовать его, а вместо этого использую какое-то сопоставление от идентификатора типа к классам или что-то в этом роде, но мне очень любопытно, возможно ли это сделать так)

ответ

1

Это поможет вам начать:

def tile1Func(): 
    return "tile 1" 

def tile2Func(): 
    return "tile 2" 

tileTypes = { 
    1: { 
     "color": "red", 
     "func": tile1Func 
    }, 
    2: { 
     "color": "green", 
     "func": tile2Func 
    } 
} 

class tile(): 
    def __init__(self, type): 
     self.color = tileTypes[type]["color"] 
     self.func = tileTypes[type]["func"] 

t1 = tile(1) 
print("color: " + t1.color + ", name: " + t1.func()) 
+0

Позор нет никакого способа определения реальной функции внутри dictonairy ... Ну хорошо, я думаю, это ближе всего :) – Johan

0
class Foo: pass 

def methodfunc(self, param): pass 

Foo.mymethod = methodfunc 

foo = Foo() 
foo.mymethod(None) 

Вышеуказанное будет работать, но только там, где экземпляры создаются после того, как класс исправлен.

1
class TileType(object): 
    def __init__(self, color, func): 
     self.color = color 
     self.func = func 

tile_types = { 
    1: TileType('red', some_func), 
    2: TileType('green', some_other_func), 
} 

type = 1 
tile = tile_types[type] 
Смежные вопросы