传递方法引用时未生成AttributeError



我对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引用绑定方法,而不是其他独立的属性。引用该方法而不调用它不会产生任何其他效果。

相关内容

  • 没有找到相关文章

最新更新