我想在类中定义一些常量,这些常量将在类实例(派生的类)中定义-
如果未在子类中重新定义此变量,如何发出错误信号?我想NotImplementedError
读一读。
class Parent(object):
abstract_variable = ?
# I want achieve same behavior for variable
def abstract_function(self):
raise NotImplementedError()
class Child(Parent):
def __init__():
# should throw NotImplementedError() on read
print self.abstract_variable
可以一行完成吗?
abstract_variable = ?
首先,最明显的是不要在父类中做任何事情。然后,在阅读时,您只会得到一个属性错误:
AttributeError: Child instance has no attribute 'abstract_variable'
或者在父类中,您可以在每个子类中都有一个使用getter和setterproperty
引发NotImplementedError
并
覆盖它的property
。或在子类中将值设置为None
在类主体中…
但是,如果要提高NotImplementedError
,则可以创建一个 非数据 描述符(即, 没有
的描述符类 ,始终具有)。这使您可以在子类中设置值。
____set__``property``__set__
最简单的方法是
class abstract_attribute(object):
def __get__(self, obj, type):
raise NotImplementedError("This attribute was not set in a subclass")
你像这样使用它
class Parent(object):
variable = abstract_attribute()
class Child(Parent):
def __init__(self):
try:
print(self.variable)
except Exception as e:
print("Got error %s" % e)
self.variable = 42
print(self.variable)
Child()
哪个输出
Got error This attribute was not set in a subclass
42
Aproperty
不能像my那样容易地设置值abstract_attribute
。
但是,等等,我们可以使其更加神奇:描述符可以找出从 哪个 属性访问它:
class abstract_attribute(object):
def __get__(self, obj, type):
# Now we will iterate over the names on the class,
# and all its superclasses, and try to find the attribute
# name for this descriptor
# traverse the parents in the method resolution order
for cls in type.__mro__:
# for each cls thus, see what attributes they set
for name, value in cls.__dict__.items():
# we found ourselves here
if value is self:
# if the property gets accessed as Child.variable,
# obj will be done. For this case
# If accessed as a_child.variable, the class Child is
# in the type, and a_child in the obj.
this_obj = obj if obj else type
raise NotImplementedError(
"%r does not have the attribute %r "
"(abstract from class %r)" %
(this_obj, name, cls.__name__))
# we did not find a match, should be rare, but prepare for it
raise NotImplementedError(
"%s does not set the abstract attribute <unknown>", type.__name__)
使用此代码,访问self.variable
会引发异常提示信息:
NotImplementedError: <__main__.Child object at 0x7f7c7a5dd860> does not
have the attribute 'variable' (abstract from class 'Parent')
并Child.variable
给
NotImplementedError: <class '__main__.Child'> does not have the
attribute 'variable' (abstract from class 'Parent')
问题内容: 我正在将一个对象传递给模板,而我需要做的就是检查值。如果该值为正,我想用绿色为特定颜色上色。如果值为负,我想用红色将特定颜色上色。 我找不到定义变量的方法。可能吗?应该是我想的 无论如何,最简单的方法是什么? 谢谢 问题答案: 如Play文档中所述,您可以使用帮助器。 或者您可以使用
问题内容: 在以下代码中,我创建了一个基本抽象类。我希望所有继承自其的类都提供该属性,因此我将该属性设置为。 然后,我创建了一个名为的子类,该子类旨在提供一些功能,但仍保持抽象。中没有属性,但是python实例化了该类的对象而没有错误。一个人如何创建抽象属性? 问题答案: 从Python 3.3 开始,修复了一个错误,这意味着装饰器现在应用于抽象方法时,可以正确地标识为抽象。 注:订单的问题,你必
问题内容: 我正在使用列表,其中列出了我的程序中的某些功能。这实际上是一个共享列表,我的所有功能都可以对其进行编辑。在所有功能中是否真的有必要将其定义为“全局”? 我的意思是在使用它的每个函数中放置global关键字,还是在所有函数之外定义它就足够了,而无需在其定义后面使用global字? 问题答案: 分配变量()时,将在当前作用域(例如,当前函数的本地范围)中创建一个变量。如果它恰好在外部(例如
问题内容: 我知道标准示例:如果直接执行模块,则其全局变量定义为。但是,在文档的任何地方都找不到关于一般情况下如何定义的精确描述。该模块的文件说… 在模块内,模块名称(作为字符串)可用作全局变量的值。 …但是“模块名称”是什么意思?它仅仅是模块的名称(已删除的文件名),还是包括标准的软件包名称? 如何确定Python模块中变量的值?为了获得加分,请准确指出此操作在Python源代码中的何处执行。
我们正在为Scala程序开发一个静态验证器(本硕士论文中描述的早期工作),目前的重点是验证涉及延迟评估的Scala特性。我们主要感兴趣的是特征的语义(行为),而不是其他(尽管很重要)方面,如可理解性或简洁性。 为了简化事情,我们暂时忽略了单例对象可能具有的特殊角色。例如,有些是伴随对象(这可能与它们的懒惰性质正交),或者有些是包对象。 懒惰的瓦尔斯 假设一个懒惰的瓦尔 其中是初始化块,即确定懒惰v
问题内容: 在我的 Dockerfile中 ,我想 定义 稍后 可以 在Dockerfile中使用的变量 。 我知道该指令,但是我不希望这些变量是环境变量。 有没有一种方法可以 在Dockerfile范围内声明变量 ? 问题答案: 您可以使用-请参阅https://docs.docker.com/engine/reference/builder/#arg 该指令定义了一个变量,用户可以在构建时使用