在Scala中,我可以定义一个抽象类并用一个对象实现它:
abstrac class Base {
def doSomething(x: Int): Int
}
object MySingletonAndLiteralObject extends Base {
override def doSomething(x: Int) = x*x
}
我在Python中的具体示例:
^{pr2}$继承在这里没有意义,因为没有两个类可以有相同的path
。而且只需要一个实例,这样类就不会充当对象的蓝图。换句话说:Resource
(在我的例子中,Book
)不需要类,但是需要一个基类来提供公共功能。在
我想要:
object Book(Resource):
path = "/book/{id}"
def get(request):
return aBook
python3的方法是什么?在
如果您可以直接实例化
Resource
,那么只需这样做,并直接将路径和get
方法粘在一起。在虽然这是假设
path
和get
没有在Resource
的__init__
方法中使用,并且路径没有被任何不应该考虑的类方法使用。在如果您的主要关注点是确保没有从
^{pr2}$Book
非类继承,那么您可以使用这个元类您可能希望用更合适的方法替换引发的异常。只有当你发现自己实例化了很多一次性实例时,这才有意义。在
如果这对你来说还不够好,而且你使用的是CPython,你可以尝试一些这样的黑客:
让我的第一个上下文管理器成为可能。在
当然,我鼓励你使用我的上述两种解决方案之一,或是凯特里亚莱克斯的ABC建议
使用decorator在创建时将继承的类转换为对象
我相信这样一个对象的概念并不是Python中典型的编码方式,但是如果必须这样做的话,下面用于立即初始化的装饰器
class_to_object
就可以做到了。初始化或任何参数都必须通过装饰对象传递:使用这个装饰器
^{pr2}$最终的结果是,您有一个与scala对象类似的对象
K
,并且名称空间中没有可用于初始化其他对象的类。在注意:为了学究,对象K的类可以被检索为
K.__class__
,因此如果有人真的想初始化其他对象的话。在Python中,如果您真的想要的话,几乎总是有一种方法可以解决问题。在使用^{} (抽象基类):
然后,需要从
Resource
继承的任何内容来实现path
。注意,path
实际上是在ABC中实现的;您可以使用super
访问这个实现。在相关问题 更多 >
编程相关推荐