Skip to content

Python 的隐藏力量(2)

原文: https://www.backtrader.com/blog/posts/2016-11-23-hidden-powers-2/hidden-powers/

让我们进一步探讨一下 Python 的隐藏功能是如何在backtrader中使用的,以及如何实现这一功能以实现主要目标:易用性

这些定义是什么?

例如,指标:

import backtrader as bt

class MyIndicator(bt.Indicator):

    lines = ('myline',)
    params = (('period', 20),)

    ... 

任何能够阅读 python 的人都会说:

  • lines是一个tuple,实际上包含一个项目,一个字符串

  • params也是一个tuple,包含另一个tuple带 2 项

但后来

扩展示例:

import backtrader as bt

class MyIndicator(bt.Indicator):

    lines = ('myline',)
    params = (('period', 20),)

    def __init__(self):

        self.lines.myline = (self.data.high - self.data.low) / self.p.period 

在这里,任何人都应该明白:

  • lines的定义已转化为一个属性,该属性可作为self.lines访问,并依次包含定义中指定的属性myline

  • params的定义已经转化为一个属性,该属性可以达到self.p(或self.params,并依次包含定义中指定的属性period

    而且self.p.period似乎有一个值,因为它直接用于算术运算(显然该值是定义中的值:20

答案是:元类

bt.Indicator因此MyIndicator也有一个元类,这允许应用元编程概念。

在这种情况下,截取参数的定义,使其成为

  • 实例的属性,即:可达为self.linesself.params

  • 的属性

  • 包含其中定义的atributes(和定义值)

部分秘密

对于那些不精通元类的人来说,或多或少是这样做的:

class MyMetaClass(type):

    def __new__(meta, name, bases, dct):
        ...

        lines = dct.pop('lines', ())
        params = dct.pop('params', ())

        # Some processing of lines and params ... takes place here

        ...

        dct['lines'] = MyLinesClass(info_from_lines)
        dct['params'] = MyParamsClass(info_from_params)

        ... 

这里拦截了的创建,并根据从定义中提取的信息,将linesparams的定义替换为

这一点本身无法达到,因此实例的创建也被拦截。使用 Pyton 3.x 语法:

class MyClass(Parent, metaclass=MyMetaClass):

    def __new__(cls, *args, **kwargs):

        obj = super(MyClass, cls).__new__(cls, *args, **kwargs)
        obj.lines = cls.lines()
        obj.params = cls.params()

        return obj 

这里,在实例中,上面定义为MyLinesClassMyParamsClass实例被放入MyClass实例中。

不,没有冲突:

  • 的意思是:“系统范围”,并且包含linesparams的自身属性,这两个类都是类

  • 实例的意思是:“系统本地”,每个实例都包含linesparams的实例(每次都不同)

例如,通常可以使用self.lines访问实例,但也可以使用MyClass.lines访问类。

后者为用户提供了对方法的访问权限,这些方法并不适用于一般用途,但这是 Python,任何东西都不能被禁止,更不用说使用开源

结论

元类在幕后工作,提供一种机制,通过处理诸如linesparamstuple定义之类的东西,使 almos 成为一种元语言

目标是让任何使用平台的人的生活更轻松


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组