Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在self中查找属性?_Python_Class - Fatal编程技术网

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