abstractproperty的实现

时间:2015-05-11 18:30:45

标签: python python-3.4 metaclass

包含某些值的变量self.x只能在子类B中创建。

此变量用于父类A并确保我不会忘记实现它,我使用@abstractproperty

此外,为了避免多次不必要地评估big_method(),我将值存储在self.__x中并返回该值。

import abc


class A(metaclass=abc.ABCMeta):

    @abc.abstractproperty
    def x(self):
        pass

    def f(self):
        print(self.x)


class B(A):

    def __init__(self):
        self.__x = None

    def big_method(self):
        # Quite a bit of code here.
        return 2

    @property
    def x(self):
        # When called for the first time, it stores the value and returns it.
        # When called later, the stored value is returned.
        if self.__x:
            pass
        else:
            self.__x = self.big_method()

        return self.__x

inst = B()
inst.f()

它按预期工作。

但是,我想知道使用abstractproperty是否有任何真正原因,因为我可以获得相同的结果(即,提醒您实施self.x通过..根本没有实现它:

  • 在目视检查代码时,我的IDE会将self.x标记为“警告”。
  • 尝试运行代码时,我会得到AttributeError
  • 最重要的是,我可以使用评论来确保我很容易理解self.x中未实现A的原因。

另外,有没有更好的方法在课程x中实施B,也就是说,不会多次重复评估big_method()

1 个答案:

答案 0 :(得分:1)

x定义为抽象属性会阻止您编写如下代码:

class A(metaclass=abc.Metaclass):
    pass

class B(A):
    # Do stuff...

inst = B(A)
inst.x = "foo"

在此,没有什么可以阻止您将x定义为B中的属性,然后在实例化后设置值。使用抽象属性,您至少需要默认值__set__才能使inst.x = "foo"生效。