Python类:如何检查属性是在__init__中还是在__init__之外定义的

时间:2018-02-02 08:29:29

标签: python python-3.x

所以,如果我有这样的课程:

class A:
    def __init__(self):
        self.a = 1
obj = A()
obj.b = 2

因为我需要编写一个 __ setattr __ 方法来修改属性(例如,如果它在 __ init __ 中定义,那么就做一些事情;如果它是在之外定义的话__init __ 做其他事情。如何确定它是否在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

1 个答案:

答案 0 :(得分:3)

您定义的大多数实例属性或父类(或对象)的行为都将相同,并且大部分都无法区分。如果你真的想要出于某种原因区分它们,你应该自己创建一种识别它们的方法,可能是通过使用字典来代替它。

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']

话虽如此,我一点也不清楚你为什么要这样做。也许您应该尝试寻找一个更简单的问题解决方案而不是覆盖__setattr__

<强>更新

在我看来,您试图限制变量的更新,可能是在您尝试创建真正的私有变量&#34;。在我的建议中,。有一个原因,Python允许你从静态语言的角度做很多看似疯狂的事情。您应该使用_启动变量,将它们标记为私有,类似于Python推荐的内容。如果人们无论如何都要访问它们,那么是什么阻止他们找到解决方法以规避&#34;限制&#34;你正试图强制执行?此外,有时存在访问私有变量的真正理由。