2010-03-29 3 views
0

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); 

     } 
} 

답변

7

이 코드를 직접 번역하는 것은 시간 낭비 일 것입니다. Java에서 Python으로 옮길 때 가장 힘든 것은 여러분이 아는 대부분을 포기하는 것입니다. 그러나 단순한 사실은 Python is not Java이며, 한 줄씩 번역하는 것은 예상대로 작동하지 않습니다. 코드가 아닌 알고리즘을 번역하는 것이 더 낫습니다. 파이썬이 잘하는 일을하도록하십시오.

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

에 동의 함! 알고리즘을 이해 한 다음이를 다른 언어로 변환/구현하는 것이 줄 단위로 번역하는 것보다 낫습니다. – ariefbayu

1

이 야구장에 라인에 대한 온라인 번역 만있는 것이 아닙니다. 동물의 종류 (부수적으로, 품종이 아님, 부수적으로)를 모으고 동물의 유형에 따라 다른 행동을하는 일련의 관련 수업을 들려주는 것 같아요.).

파이썬에서는 이것을 자연스럽게하는 방법은 메타 프로그래밍을 통해 이루어집니다. 인수를 템플릿에 전달하여 각 클래스를 반환하는 클래스 또는 팩토리 함수를 만듭니다. 함수와 클래스는 파이썬에서 1 차 객체이므로 다른 객체와 마찬가지로 전달 될 수 있습니다. 클래스 자체는 객체이기 때문에 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에 의해 리턴 된 클래스는 다른 파이썬 클래스와 같습니다. 나는 여기 예제에서 그것을 보여 주려고 노력했다.

2

그것은 나에게 불분명 자바의 원하는 의미가 될 것입니다 무슨 :