2010-03-29 113 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類一樣。我試圖在這裏的例子中顯示。