在Python中使用抽象属性实现以下Scala代码的最短/最优雅的方法是什么?
abstract class Controller {
val path: String
}
Run Code Online (Sandbox Code Playgroud)
Controller强制使用子类来定义Scala编译器的"路径".子类看起来像这样:
class MyController extends Controller {
override val path = "/home"
}
Run Code Online (Sandbox Code Playgroud) 我想在类中定义一些常量,这些常量将在类实例中定义(派生类) - 如果这些变量不在子类中重新定义,如何发出错误信号?我想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
Run Code Online (Sandbox Code Playgroud)
有可能在一行中完成吗?
abstract_variable = ?
Run Code Online (Sandbox Code Playgroud) 我花了很多时间研究这个,但没有一个答案看起来像我想要的那样.
我有一个带有类属性的抽象类,我希望每个子类都被强制实现
class AbstractFoo():
forceThis = 0
Run Code Online (Sandbox Code Playgroud)
所以,当我这样做
class RealFoo(AbstractFoo):
pass
Run Code Online (Sandbox Code Playgroud)
它会抛出一个错误,告诉我在实现之前它无法创建类forceThis.
我怎样才能做到这一点?
(我不希望该属性是只读的,但如果这是唯一的解决方案,我会接受它.)
对于一个类方法,我发现我可以做到
from abc import ABCMeta, abstractmethod
class AbstractFoo(metaclass=ABCMeta):
@classmethod
@abstractmethod
def forceThis():
"""This must be implemented"""
Run Code Online (Sandbox Code Playgroud)
以便
class RealFoo(AbstractFoo):
pass
Run Code Online (Sandbox Code Playgroud)
至少抛出错误 TypeError: Can't instantiate abstract class EZ with abstract methods forceThis
(虽然它不强制forceThis成为一种类方法.)
如何为类属性弹出类似的错误?
我想对某个函数的参数签定合同,以强制参数对象必须具有特定的属性。我了解python不是严格类型的语言,但是有时具有合同和接口非常有用。Python现在具有类型提示,这很好,因此我们可以这样做:
def myfunc(myparam: MyType) -> SomeType:
myparam.myprop # this should exist
Run Code Online (Sandbox Code Playgroud)
但是,如何说MyType必须具有特定的对象属性(myprop),而又不能在运行时插入断言和引发异常?我可以用abc元类定义抽象类,该类可以用作接口。
from abc import ABC, abstractmethod
class MyInterface(ABC):
@property
@abstractmethod
def myprop(self) -> int: pass
Run Code Online (Sandbox Code Playgroud)
现在在代码中的某个地方,我可以将MyType定义为:
class MyType(MyInterface):
myprop = 8
Run Code Online (Sandbox Code Playgroud)
它正在工作,但是 myprop是类属性,而不是对象属性(属性)。我当然可以这样做:
class MyType(MyInterface):
myprop = 0
def __init__(self):
self.myprop = 8
Run Code Online (Sandbox Code Playgroud)
很好,但是我必须定义一个(不必要的)类(“静态”)属性,并使用对象属性有效地将其隐藏。不太干净。而且现在我有一个myprop的默认值,这不是我想要的。但是,如果我这样做:
class MyType(MyInterface):
myprop = None # wrong type here
def __init__(self):
self.myprop = 8
Run Code Online (Sandbox Code Playgroud)
这是错误的,因为myprop 必须为 int且不能为None,这是由linter 正确捕获的。应该有一个没有类属性的对象属性。
目标是像mypy这样的静态检查器可以捕获实现错误,其中类不遵循已定义的接口或协定,而该协定或协定要求参数实例必须具有某些属性。
什么是pythonic(或不是pythonic)的实现方式?