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的方法是什么?
我相信这样一个对象的概念不是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中,如果你真的想要,几乎总能找到解决问题的方法.
使用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。