Python支持文字对象吗?

dea*_*mon 11 python oop singleton scala object-literal

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

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

object MySingletonAndLiteralObject extends Base {
    override def doSomething(x: Int) = x*x
}
Run Code Online (Sandbox Code Playgroud)

我在Python中的具体例子:

class Book(Resource):

    path = "/book/{id}"

    def get(request):
        return aBook
Run Code Online (Sandbox Code Playgroud)

继承在这里没有意义,因为没有两个类可以具有相同的功能path.并且只需要一个实例,因此该类不会充当对象的蓝图.换句话说:这里不需要类Resource(Book在我的例子中),但是需要一个基类来提供通用功能.

我想:

object Book(Resource):

    path = "/book/{id}"

    def get(request):
        return aBook
Run Code Online (Sandbox Code Playgroud)

Python 3的方法是什么?

Muh*_*uri 6

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

我相信这样一个对象的概念不是Python中典型的编码方式,但是如果必须的话,那么class_to_object下面的装饰器可以立即进行初始化.请注意,对象初始化的任何参数都必须通过装饰器传递:

def class_to_object(*args):
    def c2obj(cls):
        return cls(*args)
    return c2obj
Run Code Online (Sandbox Code Playgroud)

使用这个装饰我们得到

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

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

注意:为了迂腐,可以检索对象K的类,K.__class__因此如果有人真的想要,可以初始化其他对象.在Python中,如果你真的想要,几乎总能找到解决问题的方法.


Kat*_*iel 2

使用abc(抽象基类):

import abc
class Resource( metaclass=abc.ABCMeta ):
    @abc.abstractproperty
    def path( self ):
        ...
        return p
Run Code Online (Sandbox Code Playgroud)

那么任何继承自 的东西Resource都需要实现path。请注意,这path实际上是在 ABC 中实现的;您可以使用 访问此实现super