Python的等价性?

0 投票
4 回答
619 浏览
提问于 2025-04-15 20:58

有没有办法把下面的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 个回答

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类一样。我在这里的例子中尽量展示了这一点。

7

直接把这段代码翻译过来其实没什么意义。你从Java转到Python时,最难的就是要放弃你大部分的旧知识。简单来说,Python和Java是完全不同的,逐行翻译根本不会像你想的那样有效。与其逐行翻译代码,不如把算法翻译过来,让Python发挥它的优势。

撰写回答