Python的等价性?
有没有办法把下面的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
(还有它的兄弟: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类一样。我在这里的例子中尽量展示了这一点。
7
直接把这段代码翻译过来其实没什么意义。你从Java转到Python时,最难的就是要放弃你大部分的旧知识。简单来说,Python和Java是完全不同的,逐行翻译根本不会像你想的那样有效。与其逐行翻译代码,不如把算法翻译过来,让Python发挥它的优势。