Мне неясно, какой будет желаемая семантика вашей Java. Я предполагаю, что вы как бы пытаетесь смоделировать коллекцию животных (видов, а не пород, между прочим) и наполнить набор ассоциированных классов поведением, которое меняется в зависимости от типа животного (грубо говоря, звуки, которые каждый из них издает) ).
В Python естественный способ сделать это - через метапрограммирование. Вы создаете класс или фабричную функцию, которая возвращает каждый из классов, передавая аргументы в шаблон. Поскольку функции и классы являются объектами первого порядка в Python, их можно передавать как любой другой объект. Поскольку сами классы являются объектами, вы можете получить доступ к их атрибутам, используя setattr
(и его кузены: hasattr
и getattr
).
Вот простой пример:
#!/usr/bin/env python
def Animal(species, sound):
class meta: pass
def makeSound(meta, sound=sound):
print sound
setattr(meta, makeSound.__name__, makeSound)
def name(meta, myname=species):
return myname
setattr(meta, 'name', name)
return meta
if __name__ == '__main__':
animal_sounds = (('Dog', 'woof'),
('Cat', 'meow'),
('Cow', 'moo'),
('Chicken', 'cluck'),
('Elephant', 'eraunngh'))
menagerie = dict()
for animal, sound in animal_sounds:
menagerie[animal] = Animal(animal, sound)
for Beast in menagerie:
beast = Beast()
print beast.name(), ' says ',
beast.makeSound()
Dog = menagerie['Dog']
fido = Dog() # equivalent to fido = menagerie['Dog']()
fido.makeSound()
# prints "woof"
Cat = menagerie['Cat']
felix = Cat()
felix.makeSound()
Mouse = Animal('Mouse', 'squeak')
mickey = Mouse()
mouse.makeSound()
# prints "squeak"
Это похоже на банальный пример, но я надеюсь, что это понятно. Я могу создать таблицу (в данном случае кортеж кортежей), которая предоставляет аргументы, которые будут использоваться для заполнения изменяющихся параметров / поведения наших классов. Классы, возвращаемые Animal, как и любые другие классы Python. Я пытался показать это в примерах здесь.