所以,如果我有这样的课程:
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
答案 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;你正试图强制执行?此外,有时存在访问私有变量的真正理由。