2

有时我需要更改已在其余代码中广泛使用的 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__,但感觉像是将我根深蒂固的 C/C++ 思维方式强加在 Python 上。

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

4

3 回答 3

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
于 2012-06-14T00:40:20.120 回答
0

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

你为 Python 使用了哪些重构工具?

于 2012-06-14T00:53:14.777 回答
0

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

class A(object):
    @property
    def old_name(self):
        raise NotImplementedError()
于 2012-06-14T00:56:20.783 回答