2010-03-29 114 views
0

有没有办法将Java中的以下代码转换为Python的等价形式?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); 

     } 
} 

回答

7

直接翻译此代码将浪费时间。从Java转向Python最困难的事情是放弃你所知道的大部分内容。但简单的事实是,Python is not Java,并逐行翻译将无法按预期工作。翻译算法而不是代码更好,让Python做它擅长的事情。

+0

同意!理解算法,然后将其转换/实现为另一种语言比逐行翻译更好。 – ariefbayu 2010-03-29 07:32:53

1

这是不是一条线换线平移的事,但在球场:

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

这我不清楚你的Java所需的语义是什么。我猜你是在尝试对一系列动物(物种,不是品种,偶然)进行建模,并灌输一组相关的类,其行为根据动物的类型而变化(粗略地说,每种类型的声音)。

在Python中,这样做的自然方法是通过元编程。您可以创建一个类或一个工厂函数,它通过将参数传递给模板来返回每个类。由于函数和类是Python中的第一个对象,它们可以像其他对象一样传递。由于类本身就是对象,因此可以使用setattr(及其堂兄弟:hasattrgetattr)访问其属性。

这里有一个简单的例子:

#!/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类一样。我试图在这里的例子中显示。