如何在Python中实现虚拟方法?

我知道来自PHP或Java的虚拟方法。

他们如何在Python中实现?

或者让我在抽象类中定义一个空方法并覆盖它?

当然,你甚至不需要在基类中定义一个方法。 在Python中,方法比虚拟方法更好 – 它们是完全dynamic的,因为Python中的input是鸭式input

class Dog: def say(self): print "hau" class Cat: def say(self): print "meow" pet = Dog() pet.say() # prints "hau" another_pet = Cat() another_pet.say() # prints "meow" my_pets = [pet, another_pet] for a_pet in my_pets: a_pet.say() 

Python中的CatDog甚至不需要从一个通用的基类中派生出来就可以实现这种行为 – 你可以免费获得它。 也就是说,一些程序员更喜欢用更严格的方式来定义他们的类层次结构,以更好地logging它,并强加一些严格的input。 这也是可能的 – 例如参见abc标准模块 。

Python方法总是虚拟的。

实际上,在2.6版本中,python提供了一个叫做抽象基类的东西,你可以明确地设置这样的虚拟方法:

 from abc import ABCMeta from abc import abstractmethod ... class C: __metaclass__ = ABCMeta @abstractmethod def my_abstract_method(self, ...): 

它工作得很好,只要该类没有从已经使用元类的类inheritance。

来源: http : //docs.python.org/2/library/abc.html

NotImplementedError是在没有实现方法的“抽象”基类的“纯虚方法”上引发的推荐exception。

正如其他人所说,这主要是一个文档约定,并不是必需的,但这样你得到一个更有意义的exception比一个缺less的属性错误。

https://docs.python.org/3.5/library/exceptions.html#NotImplementedError说:;

此exception来自RuntimeError 。 在用户定义的基类中,抽象方法在需要派生类重写方法时应引发此exception。

例如:

 class Base(object): def virtualMethod(self): raise NotImplementedError() def usesVirtualMethod(self): return self.virtualMethod() + 1 class Derived(Base): def virtualMethod(self): return 1 print Derived().usesVirtualMethod() Base().usesVirtualMethod() 

得到:

 2 Traceback (most recent call last): File "./a.py", line 13, in <module> Base().usesVirtualMethod() File "./a.py", line 6, in usesVirtualMethod return self.virtualMethod() + 1 File "./a.py", line 4, in virtualMethod raise NotImplementedError() NotImplementedError 

相关: 是否有可能在python中做抽象类?

Python方法总是虚拟的

像伊格纳西奥所说的不知何故类inheritance可能是一个更好的方法来实现你想要的。

 class Animal: def __init__(self,name,legs): self.name = name self.legs = legs def getLegs(self): return "{0} has {1} legs".format(self.name, self.legs) def says(self): return "I am an unknown animal" class Dog(Animal): # <Dog inherits from Animal here (all methods as well) def says(self): # <Called instead of Animal says method return "I am a dog named {0}".format(self.name) def somethingOnlyADogCanDo(self): return "be loyal" formless = Animal("Animal", 0) rover = Dog("Rover", 4) #<calls initialization method from animal print(formless.says()) # <calls animal say method print(rover.says()) #<calls Dog says method print(rover.getLegs()) #<calls getLegs method from animal class 

结果应该是:

 I am an unknown animal I am a dog named Rover Rover has 4 legs 

Python方法总是虚拟的。

…只要他们不是私人的! 太不好的C + +的家伙。