【发布时间】:2014-03-18 17:40:38
【问题描述】:
我正在尝试通过装饰我的 Django (ORM) 模型(类定义)来自动编码 100 个数据库表模型,以从文件名中派生它们的类名。但我觉得我的“装饰深度”太浅了。我的__call__ 方法中是否需要函数def 或类定义?像这样简单的事情就不能完成吗?
# decorators.py
import os
from inspect import get_module
class prefix_model_name_with_filename(object):
'Decorator to prefix the class __name__ with the *.pyc file name'
def __init__(self, sep=None):
self.sep = sep or ''
def __call__(self, cls):
model_name = os.path.basename(getmodule(cls).__file__).split('.')[0]
setattr(cls, '__name__', model_name + self.sep + getattr(cls, '__name__'))
return cls
装饰器的使用示例
# models.py
from django.db import models
import decorators
@decorators.prefix_model_name_with_filename
class ShipMeth(models.Model):
ship_meth = models.CharField(max_length=1, primary_key=True)
该模型在具有新名称的模块定义中不存在,如果没有它在装饰器类(而不是模型类)中查找属性,我将无法使用它!
>>> from sec_mirror.models import ShipMeth
>>> ShipMeth.__name__
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/home/Hobson/.virtualenvs/dev/lib/python2.7/site-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 ShipMeth.__name__
AttributeError: 'prefix_model_name_with_filename' object has no attribute '__name__'
我需要以某种方式装饰模块吗?
【问题讨论】:
标签: python django class python-decorators