如何处理python杂散属性赋值

时间:2012-06-14 00:33:45

标签: python dynamic attributes

有时我需要更改已在其余代码中广泛使用的Python类属性的名称。

问题在于,由于各种原因,我可能会错过旧名称出现在class_instance.old_attribute_name = something等赋值语句中的某些地方。 例如:

class theClass:
    def __init__(self):
        self.new_attribute_name = 0

o = theClass()
o.new_attribute_name += 3
if o.new_attribute_name > 3 or o.new_attribute_name < 4:
    o.old_attribute_name = 7
do_stuff_with(o.new_attribute_name)

问题是,这可能很难发现,不会出现错误,只会创建一个无用的属性。 我考虑使用__slot__,但感觉就像强迫我在Python上深层次的C / C ++思维方式。

所以我想问一下,我在这里做错了什么? 如果我尝试(以某种方式)阻止在实例化之外创建属性,我将失去什么? 什么是处理杂散属性分配的pythonic方法?

3 个答案:

答案 0 :(得分:3)

您可以将旧属性名称设为属性

class theClass(object):
    def __init__(self):
        self.new_attribute_name = 0

    @property
    def old_attribute_name(self):
        print "Tried to access old_attribute_name"
        return self.new_attribute_name

    @old_attribute_name.setter
    def old_attribute_name(self, value):
        print "Tried to set old_attribute_name"
        return self.new_attribute_name

答案 1 :(得分:0)

您可以尝试使用“重构”工具,而不是尝试使用搜索和替换来查找需要更改的所有位置。

What refactoring tools do you use for Python?

答案 2 :(得分:0)

你可以用财产做到这一点。它将阻止获取和设置旧属性名称。

class A(object):
    @property
    def old_name(self):
        raise NotImplementedError()