相关疑难解决方法(0)

Python中的抽象属性

在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)

python oop abstract-class scala

58
推荐指数
10
解决办法
4万
查看次数

如何在Python中定义延迟变量,这会引发抽象代码骨架的NotImplementedError?

我想在类中定义一些常量,这些常量将在类实例中定义(派生类) - 如果这些变量不在子类中重新定义,如何发出错误信号?我想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)

python

5
推荐指数
1
解决办法
1709
查看次数

如何创建抽象类属性(可能是只读的)

我花了很多时间研究这个,但没有一个答案看起来像我想要的那样.

我有一个带有类属性的抽象类,我希望每个子类都被强制实现

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 abstract-class exception class-properties

5
推荐指数
1
解决办法
1257
查看次数

如何编写python中对象属性(属性)存在的接口(合约)?

我想对某个函数的参数签定合同,以强制参数对象必须具有特定的属性。我了解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)的实现方式?

python abstract-class interface contract python-3.x

5
推荐指数
1
解决办法
56
查看次数