-2

我对 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
4

1 回答 1

0

在您的第一个示例中,您只是创建了一个递归函数:

def send_data(self):
    self.send_data()

这无止境地调用自己,这就是为什么您最终会遇到递归深度异常。

您的第二个示例实际上并未调用该方法

def send_data(self):
    self.send_data

这里唯一的区别是您忘记使用().

这些都与抽象基类或继承无关。您没有将send_data函数标记为抽象函数,即使您这样做了,使用abstractmethod所做的只是使创建一个没有具体实现来替换它的类的实例是不可能的。

你不会因为你在一个类AttributeError上定义了一个方法而得到一个。ABCMeta请注意,方法只是类的属性;他们没有单独的命名空间。self.send_data引用绑定的方法,而不是其他一些单独的属性。引用该方法而不调用它不会做任何其他事情。

于 2016-09-17T16:06:03.530 回答