包含某些值的变量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
通过..根本没有实现它:
self.x
标记为“警告”。 AttributeError
。 self.x
中未实现A
的原因。另外,有没有更好的方法在课程x
中实施B
,也就是说,不会多次重复评估big_method()
?
答案 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"
生效。