You are here:  Home » 量化交易与机器学习 » backtrader » Python隐藏权力(2) – backtrader中文教程

Python中的隐藏的力量(2)

让我们解决更多的是如何Python隐藏的权力在使用backtrader,这是如何实现的,力图实现的主要目标:?方便use

What的是这些定义

例如指示器:

import backtrader as bt

class MyIndicator(bt.Indicator):

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

    ...

任何能够读蟒会说:

  • linestuple,实际上一个包含单个条目,一个string
  • params也是tuple,含有另一种tuple与2 items

But以后on

Extending的例子:

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

这应该是显而易见任何人,这里说:

  • 的定义linesclass已经变成了一个属性可达到如self.lines和包含依次属性myline中的definition

And

  • The定义中指定paramsclass已经变成一个属性可达到如self.p(或self.params)和又包含属性period如definition

    And指定self.p.period似乎有一个值,因为它是直接被在算术运算中使用(显然的值是从所述一个定义:20

回答:Metaclasses

bt.Indicator,因此也MyIndicatormetaclass这允许应用metaprogrammingconcepts.

In这种情况下the interception of the definitions of “lines“ and “params“
to
让他们为:

  • `的instances,即属性:作为可达self.linesself.params
  • 的属性的classes
  • 内含atributes(和定义的值),其在secret

For的them

Part定义那些不熟悉metaclasses,它是多还是少这样做:

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)

        ...

这里创立了class已经截获和的定义linesparams已被替换class基于在信息从definitions.

This仅此一项就无法达到提取,所以实例的创建也是截获。随着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

在这里,在实例instances以上被定义为是什么MyLinesClassMyParamsClass已投入的情况下MyClass.

没有,有没有冲突:

  • class是这么说的:“全系统”,包含自己的属性为linesparams这是classes
  • Theinstance是这么说的:“系统的本地”,并且每个实例都包含实例(每次都不同)linesparams

一般一个将例如工作与self.lines访问例如,但人们也可以使用MyClass.lines访问class.

The后者给予的方法,这并不意味着对于一般用户访问使用,但这是Python和没有什么可以禁止,甚至更少的Open
Source

Conclusion

Metaclasses都在幕后工作,以提供机械使Almos酒店一种元语言通过处理之类的东西了tuple的定义linesparams

作为使用platform

评论被关闭。