Python隐藏权力(2) – backtrader中文教程
Python中的隐藏的力量(2)
让我们解决更多的是如何Python隐藏的权力在使用backtrader,这是如何实现的,力图实现的主要目标:?方便use
What的是这些定义
例如指示器:
import backtrader as bt class MyIndicator(bt.Indicator): lines = ("myline",) params = (("period", 20),) ...
任何能够读蟒会说:
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
这应该是显而易见任何人,这里说:
- 的定义
lines
在class已经变成了一个属性可达到如self.lines
和包含依次属性myline
中的definition
And
- The定义中指定
params
在class已经变成一个属性可达到如self.p
(或self.params
)和又包含属性period
如definitionAnd指定
self.p.period
似乎有一个值,因为它是直接被在算术运算中使用(显然的值是从所述一个定义:20
)
回答:Metaclasses
bt.Indicator
,因此也MyIndicator
有metaclass这允许应用metaprogrammingconcepts.
In这种情况下the interception of the definitions of “lines“ and “params“
to让他们为:
- `的instances,即属性:作为可达
self.lines
和self.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已经截获和的定义lines
和params
已被替换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以上被定义为是什么MyLinesClass
和MyParamsClass
已投入的情况下MyClass
.
没有,有没有冲突:
- 该class是这么说的:“全系统”,包含自己的属性为
lines
和params
这是classes - Theinstance是这么说的:“系统的本地”,并且每个实例都包含实例(每次都不同)
lines
和params
一般一个将例如工作与self.lines
访问例如,但人们也可以使用MyClass.lines
访问class.
The后者给予的方法,这并不意味着对于一般用户访问使用,但这是Python和没有什么可以禁止,甚至更少的Open
Source
Conclusion
Metaclasses都在幕后工作,以提供机械使Almos酒店一种元语言通过处理之类的东西了tuple
的定义lines
和params
作为使用platform
评论被关闭。