广泛的对象组成

时间:2011-04-24 16:03:27

标签: python django composition

我有一个Django模型,它有很多方法(并且将来会继续有更多),因为它是应用程序的核心。它是与遗留数据库连接的自定义用户模型。有一些方法可以检查用户对不同区域,不同类型的成本等的访问权限。

由于有一组方法彼此相关,因此将它们分解为单独的类并使用对象组合是有意义的。不过,我的问题是如何让最终开发人员看到它。他们应该使用对象链,例如user.access.has_normal_access(),还是应该在User对象上有简单地传递给底层对象的方法?

在Python中似乎不鼓励对象链接,但是创建传递方法的替代方法似乎与目的不一致,即减少主类中方法的数量。

思想?

2 个答案:

答案 0 :(得分:0)

如果要将同一底层数据库模型上的方法拆分为不同的相关方法集,可能应该使用proxy models

将使用相同的基础数据库,但将使用不同的不同类。

当你谈论User课时,我不确定这是最好的解决方案。你没有提供足够的细节让我肯定地说,但你肯定可以使用builtin permissions来实现你想要的目标吗?

答案 1 :(得分:0)

我假设使用装饰器的非django,纯python解决方案对你来说没问题。

请考虑以下代码

def check1(): print "check1"
def check2(): print "check2"

def dev_api(f):
    def fd(*args, **kw):
        check1()
        check2()
        f(*args, **kw)
        # optionally, perform some post check
        print "post check"
    return fd

@dev_api
def business(a, b, *args, **kw):
    print 'business', a, b, args, kw

business(1, 2, 'a', 'b', 'c', x='x', y='y')
  • check1,check2你的持续时间,不同的成本函数等。
  • dev_api是您的“检查”功能分组功能
  • 业务是业务逻辑功能,执行需要受“检查”功能的约束

现在,您可以公开上面修饰的业务逻辑函数或公开装饰器本身以供最终开发人员使用。

有更多要学习装饰器(即带参数的装饰器)。如果需要,请随时索取更多示例。

上述代码的输出

check1
check2
business 1 2 ('a', 'b', 'c') {'y': 'y', 'x': 'x'}
post check