2024-05-19 22:10:56 发布
网友
python如何处理面向对象的构造,如abstract,virtual,pure virtual等
例子和链接将真的很好。在
一个抽象的方法是(在基类中)引发NotImplementedError的方法。在
NotImplementedError
抽象类,像C++一样,是任何一个具有一个或多个抽象方法的类。在
Python中的所有方法都是虚拟的(也就是说,所有的方法都可以被子类覆盖)。在
“纯虚拟”方法可能与抽象方法是相同的。在
在每种情况下,你都可以尝试深奥的魔法来对抗语言,但这样做(一般来说)是极其愚蠢的。在
我努力在两本书、十几个视频、二十多篇论文、PDF和其他演示文稿中处理“etc”部分,我不能在接下来的几天里把它们都总结出来。问具体的问题,我很乐意尝试回答!在
python如何处理面向对象的构造,如抽象、虚拟、纯虚拟等
这些是语言构造而不是OO构造。可以说,抽象是一种语言不可知的概念(即使Python不需要它),虚拟和纯虚拟是C++的实现细节。在
有两个OO构造在Python中不是必需的,但有时很有用。在
当(1)你有单一继承,(2)你有静态类型检查时,“接口”的概念是有意义的。由于Python具有多重继承,并且没有静态类型检查,所以这个概念几乎与无关。在
但是,您可以定义类似“接口”的超类,它们实际上除了定义接口之外什么都不做。这是方便的文件。下面是一个成语。在
class InterfaceMixin( object ): def requiredMethod( self ): raise NotImplemntedError() class RealClass( SuperClass, InterfaceMixin ): def requiredMethod( self ): # actual implementation.
“抽象”的概念只有在进行静态类型检查时才有意义,并且需要提醒编译器在这个类定义中的一个或多个方法中没有正文。它还警告编译器不能创建实例。在Python中不需要这样做,因为方法是在运行时动态定位的。尝试使用未定义的方法只是一个AttributeError。在
AttributeError
你能做的最接近的事情。在
它不完全像java或C++ +{< CD2>}。它是一个具有引发错误的方法的类。但是它的行为非常像一个抽象类,因此非常有用。在
为了匹配Java,必须防止创建实例。这要求您重写__new__。如果您这样做了,那么您的具体子类将需要实现__new__,这是一个棘手的问题,因此我们很少采取主动步骤来防止创建本应是抽象的东西的实例。在
__new__
编辑
没有显式方法定义的抽象示例。在
>>> class Foo( object ): ... pass ... >>> f= Foo() >>> f.bar() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Foo' object has no attribute 'bar'
一个抽象的方法是(在基类中)引发
NotImplementedError
的方法。在抽象类,像C++一样,是任何一个具有一个或多个抽象方法的类。在
Python中的所有方法都是虚拟的(也就是说,所有的方法都可以被子类覆盖)。在
“纯虚拟”方法可能与抽象方法是相同的。在
在每种情况下,你都可以尝试深奥的魔法来对抗语言,但这样做(一般来说)是极其愚蠢的。在
我努力在两本书、十几个视频、二十多篇论文、PDF和其他演示文稿中处理“etc”部分,我不能在接下来的几天里把它们都总结出来。问具体的问题,我很乐意尝试回答!在
python如何处理面向对象的构造,如抽象、虚拟、纯虚拟等
这些是语言构造而不是OO构造。可以说,抽象是一种语言不可知的概念(即使Python不需要它),虚拟和纯虚拟是C++的实现细节。在
有两个OO构造在Python中不是必需的,但有时很有用。在
当(1)你有单一继承,(2)你有静态类型检查时,“接口”的概念是有意义的。由于Python具有多重继承,并且没有静态类型检查,所以这个概念几乎与无关。在
但是,您可以定义类似“接口”的超类,它们实际上除了定义接口之外什么都不做。这是方便的文件。下面是一个成语。在
“抽象”的概念只有在进行静态类型检查时才有意义,并且需要提醒编译器在这个类定义中的一个或多个方法中没有正文。它还警告编译器不能创建实例。在Python中不需要这样做,因为方法是在运行时动态定位的。尝试使用未定义的方法只是一个
AttributeError
。在你能做的最接近的事情。在
^{pr2}$它不完全像java或C++ +{< CD2>}。它是一个具有引发错误的方法的类。但是它的行为非常像一个抽象类,因此非常有用。在
为了匹配Java,必须防止创建实例。这要求您重写
“虚拟”和“纯虚拟”的概念是强制方法查找的C++优化。Python总是这样做。在__new__
。如果您这样做了,那么您的具体子类将需要实现__new__
,这是一个棘手的问题,因此我们很少采取主动步骤来防止创建本应是抽象的东西的实例。在编辑
没有显式方法定义的抽象示例。在
相关问题 更多 >
编程相关推荐