【发布时间】:2011-06-25 09:20:04
【问题描述】:
我很抱歉没有给这个问题一个更好的标题;我发布它的原因是我什至没有正确的术语来知道我在寻找什么。
我已经定义了一个具有“垃圾邮件”属性的类:
def SpamClass(对象): def __init__(self, arg): self.spam = arg def __str__(self): 返回 self.spam我想创建一个(子/兄弟?)类,它具有完全相同的功能,但使用名为“eggs”而不是“spam”的属性:
def EggsClass(对象): def __init__(self, arg): self.eggs = arg def __str__(self): 返回self.eggs概括地说,我如何创建具有任意属性名称的功能相同的类?当类有复杂的行为时,重复代码似乎很愚蠢。
更新:我同意这听起来像是糟糕的设计。澄清一下,我并不是想以这种愚蠢的方式解决特定问题。我只想知道如何在保留功能的同时任意命名对象__dict__ 的(非魔法)内容。考虑类似keys() 类对象的keys() 方法。人们使用符合约定的keys() 方法创建各种类,命名约定是一件好事。但是这个名字是随意的。如何在不手动替换源代码中的 /keys/spam/ 的情况下使用完全替换 keys() 的 spam() 方法创建一个类?
重载__getattr__ 和朋友引用通用属性对我来说似乎不优雅和脆弱。如果子类重新实现这些方法,它必须适应这种行为。我宁愿让用户觉得只有一个带有命名属性的基类,可以天真地访问。
实际上,我可以想到一个合理的用例。假设您想要一个具有特殊属性的 mixin 类和一些密切相关的方法来操作或依赖于该属性。用户可能希望在重用底层行为的同时,为不同的类以不同的方式命名这个特殊属性(以匹配实际问题域中的名称或避免名称冲突)。
【问题讨论】:
-
如果类相同,为什么需要不同的属性名?
-
这真是一个非常糟糕的设计。
标签: python attributes introspection metaclass