python - Python 是否支持文字对象之类的东西?

标签 python oop scala singleton object-literal

在 Scala 中我可以定义一个抽象类并用一个对象来实现它:

abstrac class Base {
    def doSomething(x: Int): Int
}

object MySingletonAndLiteralObject extends Base {
    override def doSomething(x: Int) = x*x
}

我在 Python 中的具体示例:

class Book(Resource):

    path = "/book/{id}"

    def get(request):
        return aBook

继承在这里没有意义,因为没有两个类可以有相同的路径。而且只需要一个实例,这样类就不会充当对象的蓝图。换句话说:此处不需要 Resource(在我的示例中为 Book)类,但需要基类来提供通用功能。

我想要:

object Book(Resource):

    path = "/book/{id}"

    def get(request):
        return aBook

Python 3 的实现方式是什么?

最佳答案

在创建时使用装饰器将继承类转换为对象

我相信这种对象的概念不是 Python 中的典型编码方式,但如果您必须这样做,那么下面用于立即初始化的装饰器 class_to_object 就可以解决问题。请注意,任何用于对象初始化的参数都必须通过装饰器传递:

def class_to_object(*args):
    def c2obj(cls):
        return cls(*args)
    return c2obj

使用这个装饰器我们得到

>>> @class_to_object(42)
... class K(object):
...     def __init__(self, value):
...         self.value = value
... 
>>> K
<__main__.K object at 0x38f510>
>>> K.value
42

最终结果是您有一个对象 K 类似于您的 scala 对象,并且命名空间中没有类可以从中初始化其他对象。

注意:为了迂腐,对象 K 的类可以作为 K.__class__ 检索,因此如果有人真的想要,可以初始化其他对象。在 Python 中,如果您确实需要,几乎总有办法解决问题。

关于python - Python 是否支持文字对象之类的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3520052/

相关文章:

scala - Spark DataFrame 不尊重模式并将所有内容视为字符串

scala - 执行 Scalac -Xprint :typer? 时什么是 <stable> 和 <accessor>

scala - 在 SBT 中导入 scala.tools.reflect.ToolBox 时出错

python - python 中的哨兵循环

Python 装饰器与 CLOS "around"方法的比较

python - 方法的装饰器参数不能是基于类的静态成员的列表理解

javascript - 是否可以在运行时迭代 Typescript 类抽象方法?

asp.net - 存储站点配置数据的最佳方式是什么?

python - 霍夫过滤后没有结果

python - 微软 Azure : obtaining public IP on Linux with azure API for Python