0

我正在尝试使用该type(,,)函数来动态构建模块。.tex该模块创建表示模板的类,我需要为特定文件夹中的每个文件创建一个新类。例如,如果我有一个a4-page-template.tex文件,我需要创建一个名为A4PageTemplate.

我可以使用 type 语句轻松地创建类型;我到目前为止的样子是这样的;

#
# dynamictypes.py
# 
import os, re

_requiredEnd = "-template.tex"
_packageDir = "C:\\Users\\...";

def _getClassName(name):
  return re.sub("-(.)", lambda m: m.group(1).upper() , name) + "Template"

for file in os.listdir(_packageDir):
  if file.lower().endswith(_requiredEnd):
    _fileWithoutExt = file[:-len(_requiredEnd)]
    _className = _getClassName(_fileWithoutExt)
    _newClass = type(_className, (object,), dict(template=file))
    print _newClass

注意倒数第二行创建了类型,它后面的 print 语句表明已经为每个模板创建了一个类型;

<class 'dynamictypes.PandocA4BookTemplate'>
<class 'dynamictypes.PandocBookTemplate'>
<class 'dynamictypes.PandocCompactTemplate'>

但是,当我使用模块时,我无法使用类型;如果我写这个消费者脚本;

import dynamictypes

myTemplate = dynamictypes.PandocA4BookTemplate()

我收到此错误;

Traceback (most recent call last):
  File "C:\Users\steve.cooper\Desktop\driver.py", line 3, in <module>
    myTemplate = dynamictypes.PandocA4BookTemplate()
AttributeError: 'module' object has no attribute 'PandocA4BookTemplate'

你能想出一种方法让我将我创建的类型添加到模块中,使其成为模块的一流部分吗?

4

1 回答 1

3

您已经创建了新类并将其分配给全局变量_newClass,但您没有存储此变量!请注意,如果这样做,dynamictypes._newClass您将获得创建的最终类型。

在创建每个新类时,您需要创建一个变量来保存它:

globals()[ _className ] = _newClass

这会将 _className 注册为模块中的全局变量,以便您可以从外部访问它。

顺便说一句,你的正则表达式失败了a4-page-template.tex——你得到a4PageTemplate的是A4PageTemplate.

于 2010-08-11T13:26:11.447 回答