Python类:如何检查属性是在_init____内定义还是在_init外定义__

Python类:如何检查属性是在_init____内定义还是在_init外定义__,python,python-3.x,Python,Python 3.x,如果我有一个这样的课程: class A: def __init__(self): self.a = 1 obj = A() obj.b = 2 因为我需要编写一个\uuuu setattr\uuuuuu方法来修改属性(例如,如果它是在\uuuu init\uuuu内部定义的,那么就做些什么;如果它是在\uuuu init\uuuuu外部定义的,那么就做些其他事情。我如何确定它是否在init中声明 def __setattr__(self,name,value):

如果我有一个这样的课程:

class A:
    def __init__(self):
        self.a = 1
obj = A()
obj.b = 2
因为我需要编写一个\uuuu setattr\uuuuuu方法来修改属性(例如,如果它是在\uuuu init\uuuu内部定义的,那么就做些什么;如果它是在\uuuu init\uuuuu外部定义的,那么就做些其他事情。我如何确定它是否在init中声明

def __setattr__(self,name,value):
    if name not in self.__dict__:
        self.__dict__['ABC'+ name] = value # add 'ABC' before attribute's name if it was declared in __init__
    else:
        self.__dict__[name] = value # if it was declared outside __init__ then the attribute name doesn't change

您定义的大多数实例属性或父类(或对象)所做的大多数实例属性的行为都是相同的,并且在很大程度上是不可区分的。如果您真的想出于任何原因区分它们,您应该自己创建一种方法来识别它们,也许可以使用字典来代替

class A:
    def __init__(self):
        self.my_variables = {'a': 1}

        # Or maintain a list with their names, it seems ugly however
        self.my_variables = ['a']
话虽如此,我还是不清楚您为什么要这样做。也许您应该尝试寻找一种比重写
\uuuuuu setattr\uuuuu
更简单的解决方案

更新:


在我看来,您试图限制变量的更新,可能是为了创建“真正的私有变量”。在我的建议中,不要。Python允许你做很多从静态语言的角度看似乎疯狂的事情是有原因的。你应该用
\uu
开始你的变量,将它们标记为私有,类似于Python建议的。如果人们无论如何都要访问它们,那么是什么阻止了它们从寻找解决办法到规避“限制”您试图强制执行的?此外,有时访问私有变量有一个真正的理由。

这方面的用例是什么?在定义属性的位置上没有区别。Python之所以如此优秀,部分原因是它实际上没有特殊情况。
self.a=…
使用完全相同的机制工作sm as
obj.b=…
确实…@Daniel Roseman,哦,这就像属性是在init中定义的(即名称以“ABC”开头),然后当类外的方法试图更改它们时会引发错误,这不是用例。它仍然描述了您的解决方案,而不是要解决的根本问题。