Python 如何在self中查找属性?
上面的代码将返回一个错误并显示Python 如何在self中查找属性?,python,class,Python,Class,上面的代码将返回一个错误并显示 class C: def __init__(self): self.a = 1 self.b = 2 def __setattr__(self,name,value): if a in self.__init__: #Determine if a is an instance of __init__ function do something 如果我不遍历self.\uuu
class C:
def __init__(self):
self.a = 1
self.b = 2
def __setattr__(self,name,value):
if a in self.__init__: #Determine if a is an instance of __init__ function
do something
如果我不遍历self.\uuuuu init\uuuu
函数,我怎么知道self.\uuuuuu init\uu
函数中定义了哪些属性
如果在
init
中设置了一个属性,我想设置前缀为的名称“sometstring”
,并将其附加到self\uu dict\uuuuuu
:例如,如果我在self.\uuuu dict\uuuuu
之后打印{sometstring'a':1,'sometstring'b':2}
添加一个属性,列出在\uuuu init\uuuu
中设置的属性,并使用该属性
if name in self.__init__:
TypeError: argument of type 'method' is not iterable
另一个选项是复制方法末尾的self.\uuu dict\uuuu
键:
class C:
predefined = ['a', 'b']
def __init__(self):
self.a = 1
self.b = 2
def __setattr__(self,name,value):
if name in self.predefined:
do something
else:
do something else
class C():
定义初始化(self,a,b):
self.a=a
self.b=b
a=C(1,2)
打印(a.。uuuu dict_uuuu)
>>>{'a':1,'b':2}
所以\uuuu dict\uuuu.keys()
将为您提供属性列表
但是:::
如果要在\uuuu setattr\uuuuuu
中检查属性列表,则必须记住,在执行a=C(1,2)
时也会调用此函数,因此不应在这一级别的代码中检查属性。\uuuu init\uuuuuu
类似于其他语言中的构造函数。您设置为self
的任何属性都可以通过self.
@Carcigenicate获得,因为如果在init中设置了属性,我想设置以“somestring”为前缀的名称,并将其附加到self\uu dict\uuuu:例如,如果我打印self.\uu dict\uuu在self.\uu setattr\uu之后,它将打印{'somestring\u a':1,'somestring\ub':2}我可能建议在init上使用一个decorator,为init提供一个代理对象,而不是self,这样它就可以捕获赋值并映射名称。属性决不是方法的“内部”。它们可以在一个方法中设置。但你必须自己记录下来。你也可以做各种各样的内省技巧来让黑客们知道如何做到这一点。从根本上说,这听起来不像是一个好主意,与这个问题有着天壤之别。您是否使用两个帐户发布问题?为什么?如果我们不添加此列表,我们无法访问self.\uuuu init\uuuu
?您需要分解字节码,并找到分配给self.something
的代码。不容易。
class C:
def __init__(self):
self.a = 1
self.b = 2
self.predefined = set(self.__dict__)
def __setattr__(self,name,value):
if name in self.predefined:
do something
else:
do something else