ジーザス クライスト パイソンは、私が今まで扱った中で最も不可解です。
何らかの理由で、このクラスに関数を追加することさえできません (ライブラリの一部ではなく、プロジェクトに含まれています)。Pygal はある種の「Ghost」クラス クラスを使用して、私を完全にねじ込みます。
ブラック マジック IE によってのみインスタンス化できる次の Line クラスを考えてみましょう: pygal.Line(Config)
class Line(Graph):
"""Line graph"""
strum_count_dict = {}
def __init__(self, *args, **kwargs):
self._self_close = False
super(Line, self).__init__(*args, **kwargs)
まっすぐに見えますか?
ここにグロストクラスの一部があります。
REAL_CHARTS = {}
for NAME in CHARTS_NAMES:
mod_name = 'pygal.graph.%s' % NAME.lower()
__import__(mod_name)
mod = sys.modules[mod_name]
REAL_CHARTS[NAME] = getattr(mod, NAME)
class Ghost(object):
def __init__(self, config=None, **kwargs):
"""Init config"""
name = self.__class__.__name__
self.cls = REAL_CHARTS[name]
self.uuid = str(uuid4())
if config and isinstance(config, type):
config = config()
if config:
config = config.copy()
else:
config = Config()
config(**kwargs)
self.config = config
self.raw_series = []
self.raw_series2 = []
そしてpygalのinit
__version__ = '1.1.0'
import sys
from pygal.config import Config
from pygal.ghost import Ghost
from pygal.graph import CHARTS_NAMES
CHARTS = []
CHARTS_BY_NAME = {}
for NAME in CHARTS_NAMES:
_CHART = type(NAME, (Ghost,), {})
CHARTS.append(_CHART)
CHARTS_BY_NAME[NAME] = _CHART
setattr(sys.modules[__name__], NAME, _CHART)
__all__ = CHARTS_NAMES + [Config.__name__, 'CHARTS', 'CHARTS_BY_NAME'] # @UndefinedVariable
関数を Line.py ファイルに追加すると、次のことが明らかになります。
AttributeError: 'Line' オブジェクトに属性 'set_extra_data' がありません
いつものように定義されている場合でも:
def set_extra_data(self):
print "--> FML Python"
ここで何が起こっているのか誰にもわかりませんか?