Эквивалентность Python? - PullRequest
0 голосов
/ 29 марта 2010

Есть ли способ преобразовать следующий код в Java в эквивалент Python?

public class Animal{

public enum AnimalBreed{

    Dog, Cat, Cow, Chicken, Elephant
}

private static final int Animals = AnimalBreed.Dog.ordinal();

    private static final String[] myAnimal = new String[Animals];
    private static Animal[] animal = new Animal[Animals];

    public static final Animal DogAnimal = new Animal(AnimalBreed.Dog, "woff");
    public static final Animal CatAnimal = new Animal(AnimalBreed.Cat, "meow");
    private AnimalBreed breed;

public static Animal myDog (String name) {
        return new Animal(AnimalBreed.Dog, name);

      }
}

Ответы [ 4 ]

7 голосов
/ 29 марта 2010

Перевод этого кода напрямую будет пустой тратой времени. Самое сложное при переходе с Java на Python - отказаться от большей части того, что вы знаете. Но простой факт заключается в том, что Python не является Java , и перевод строка за строкой не будет работать, как вы ожидаете. Лучше переводить алгоритмы, чем код, и позволить Python делать то, что у него хорошо получается.

2 голосов
/ 30 марта 2010

Мне неясно, какой будет желаемая семантика вашей 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. Я пытался показать это в примерах здесь.

1 голос
/ 29 марта 2010

Это не построчный перевод, а что-то в поле зрения:

class Animal(object):
    animal_breeds = "Dog Cat Cow Chicken Elephant".split()
    animals = {}

    def __init__(self, breed, name):
        self._breed = breed
        self.name = name
        Animal.animals[name] = self

    @property
    def breed(self):
        return Animal.animal_breeds[self._breed]

    @staticmethod
    def myDog(name):
        return Animal(Animal.AnimalBreed.Dog, name)

# add enumeration of Animal breeds to Animal class
class Constants(object): pass
Animal.AnimalBreed = Constants()
for i,b in enumerate(Animal.animal_breeds):
    setattr(Animal.AnimalBreed, b, i)

# define some class-level constant animals
# (although "woff" and "meow" are not what I would expect
# for names of animals)    
Animal.DogAnimal = Animal(Animal.AnimalBreed.Dog, "woff")
Animal.CatAnimal = Animal(Animal.AnimalBreed.Cat, "meow")

# this code would be in a separate module that would import this
# code using
#     from animal import Animal
#
print Animal.myDog("Rex").breed
print Animal.animals.keys()
0 голосов
/ 29 марта 2010

http://code.activestate.com/recipes/413486/ содержит много помощи по этой теме. Имейте в виду, что поддержка Deepcopy, вероятно, не работает с ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...