【发布时间】:2011-12-17 10:37:20
【问题描述】:
在 Python 中,您可以从定义类之外分配一个任意属性:
class Profile(models.Model):
user = models.OneToOneField(User)
name = models.CharField(max_length=140)
p = Profile()
p.age = 42
这里的底层机制是__dict__ 属性,它维护着一个包含所有属性的字典。
我们都被告知not to expose our inner workings to the client code,但附加新数据根本与封装无关,对吧?这个成语在 Python 代码中很常见吗?
就是我的意思……
每个Tweet 都有标准字段,例如id、text、owner。
在为用户返回推文列表时,您希望显示推文是否被该用户“收藏”。
显然,要获取is_favorite,您需要查询此user 的多对多关系。
是否可以用当前用户对应的is_favorite 预填充Tweet 对象?
当然我可以公开一个方法is_favorite_for(user),但我遇到了Django template language 限制,它不允许从模板内部调用带有参数的方法。另外,我认为模板根本不应该调用方法。
我知道这会工作很好,但我想知道在开源项目中做这样的事情是否会让其他开发人员鄙视我。
旁注:
我来自 C#/.NET 背景,其中动态类型是最近才引入的,除了一些小众领域(互操作性、IoC 框架、REST 客户端框架等)外,并没有得到广泛应用。
【问题讨论】:
标签: python oop encapsulation dynamic-languages design-principles