我对python 2.7有一个简单的疑问:
我创建了一个抽象基类和一个子类:
from abc import ABCMeta, abstractmethod
class Base:
"""
Abstract base class for all entities.
"""
__metaclass__ = ABCMeta
def __init__(self, name):
self.name = name
def send_data(self):
self.send_data()
class Child (Base):
def __init__(self, name):
super(Child, self).__init__(name=name)
当创建子类的对象并调用send_method时,我得到以下错误,这是预期的行为:
sample = Child('test')
sample.send_data()
# …
RuntimeError: maximum recursion depth exceeded
但是当send_method引用在基类中传递并通过创建子类对象调用send_method时,我认为预期的行为是接收AttributeError
,但我很惊讶地看到没有生成错误。请解释。
from abc import ABCMeta, abstractmethod
class Base:
"""
Abstract base class for all entities.
"""
__metaclass__ = ABCMeta
def __init__(self, name, parent):
self.name = name
self.parent = parent
def send_data(self):
self.send_data
sample = Child('test')
sample.send_data()
# No error
在第一个示例中,您简单地创建了一个递归函数:
def send_data(self):
self.send_data()
调用它自己,没有结束,这就是为什么你会得到一个递归深度异常。
第二个例子实际上并没有调用:
方法def send_data(self):
self.send_data
唯一的区别是您忘记使用()
。
这些都与抽象基类或继承无关。您没有将send_data
函数标记为抽象函数,即使您这样做了,使用abstractmethod
所做的只是使不可能创建没有具体实现来替代它的类的实例。
你不会因为在ABCMeta
类上定义了一个方法就得到一个AttributeError
。注意,方法只是类的属性;它们没有单独的名称空间。self.send_data
引用绑定方法,而不是其他独立的属性。引用该方法而不调用它不会产生任何其他效果。