用任意替换的属性名创建Python类

我很抱歉不给这个问题一个更好的标题; 我发布它的原因是我甚至没有正确的术语来知道我在找什么。

我定义了一个具有“垃圾邮件”属性的类:

def SpamClass(object):
    def __init__(self, arg):
        self.spam = arg
    def __str__(self):
        return self.spam

我想创建一个(sub / sibling?)类,它具有完全相同的功能,但具有名为'eggs'而不是'spam'的属性:

def EggsClass(object):
    def __init__(self, arg):
        self.eggs = arg
    def __str__(self):
        return self.eggs

概括来说,我如何创建具有任意属性名称的功能相同的类? 当这个类有复杂的行为时,复制代码似乎很愚蠢。

更新 :我同意这味道不好设计。 为了澄清,我并没有试图用这种愚蠢的方式解决特定的问题。 我只想知道如何在保留功能的同时任意命名对象__dict__的(非魔术)内容。 考虑像dict like对象的keys()方法。 人们使用keys()方法创建各种类,这些方法按照惯例行事,命名约定是一件好事。 但这个名字是任意的。 我怎样才能用一个完全替代keys()spam()方法创建一个类,而无需在源代码中手动替换/ keys / spam /?

重载__getattr__和朋友来引用泛型属性对我来说似乎是不雅和脆弱的。 如果子类重新实现这些方法,它必须适应这种行为。 我宁愿让用户觉得只有一个具有可以天真访问的命名属性的基类。

其实,我可以想象一个合理的用例。 假设你想要一个mixin类来赋予一个特殊的属性和一些密切相关的方法来操作或依赖这个属性。 用户可能想要为不同类别命名这个特殊属性(以匹配真实世界问题域中的名称或避免名称冲突),同时重用底层行为。


这是一种获得我认为你想要的效果的方法。

使用通用属性名称定义泛型类。 然后,在每个子类中,遵循http://docs.python.org/reference/datamodel.html#customizing-attribute-access中的建议,使属性看起来像外部,就像调用它所要调用的任何东西。

你对你所做的描述感觉就像它有一个“代码味道”给我,我建议你仔细检查你的设计,看看这是否真的是你想要做的。 但是,你可以使它适用于我的建议。


您也可以创建一个拥有所有常见内容的超类,然后创建具有特定属性的子类。

甚至:

def SuperClass(object):
    specific_attribute = 'unset'

    def __init__(self, arg):
        setattr(self, specific_attribute, arg)

    def __str__(self):
        return getattr(self, specific_attribute)


def EggClass(SuperClass):
    specific_attribute = 'eggs'

你认为不是过于复杂的事情,只是创建一个班级? (因为无论如何它们是相同的)

class FoodClass(object):
    def __init__(self, foodname, arg):
        self.attrs = {foodname: arg}
        self.foodname = foodname

    def __str__(self):
        return self.attrs[foodname]

如果你想要一些漂亮的构造函数,可以单独创建它们:

def make_eggs(arg):
    return FoodClass('eggs', arg)

def make_spam(arg):
    return FoodClass('spam', arg)
链接地址: http://www.djcxy.com/p/75513.html

上一篇: creating Python classes with arbitrarily substituted attribute name

下一篇: Checking whether a variable is an integer or not