Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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中动态添加和绑定描述符?_Python_Class_Getter Setter - Fatal编程技术网

如何在python中动态添加和绑定描述符?

如何在python中动态添加和绑定描述符?,python,class,getter-setter,Python,Class,Getter Setter,我想动态地将描述符绑定到类的属性 例如,我有一个描述符,它只是一个伪示例: class Item(object): def __init__(self, filename): self.filename = filename def __get__(self, obj=None, objtype=None): #print '__get__(%s, %s)' % (obj, objtype) return open(self.fi

我想动态地将描述符绑定到类的属性

例如,我有一个描述符,它只是一个伪示例:

class Item(object):
    def __init__(self, filename):
        self.filename = filename

    def __get__(self, obj=None, objtype=None):
        #print '__get__(%s, %s)' % (obj, objtype)
        return open(self.filename).read()

    def __set__(self, obj, val):
        #print '__set__(%s, %s)' % (obj, val)
        open(self.filename, 'w').write(str(val))
在我的主容器中,我想动态注册我的描述符

如果我在类级别实例化描述符,一切都会很好:

class Container(object):
    foo = Item('foo')
    bar = Item('bar')
不幸的是,当我尝试使用setattr动态关联描述符时,我需要给我的类增加更多的复杂性:

class Container(object):
    def __init__(self, data):
        for attr in data:
            super(Container, self).__setattr__(attr, Item(attr))

    def __setattr__(self, name, value):   
        #print '__setattr__(%s, %s)' % (name, value)
        attr = super(Container, self).__getattribute__(name)
        if hasattr(attr, '__set__'):
            attr.__set__(name, value)
        else:
            super(Container, self).__setattr__(name, value)        

    def __getattribute__(self, name):
        #print '__getattribute__(%s)' % (name)
        attr = super(Container, self).__getattribute__(name)
        if hasattr(attr, '__get__'):
            return attr.__get__(name)
        return attr
预期产出为:

>>> c = Container(['foo', 'bar'])  
>>> c.foo = 2
>>> c.foo
'2'

有没有一个更简单的解决方案可以减少麻烦?

所以,您的uu init_u_u_u___________________________。您遇到的问题:

在99.9%的情况下,你不应该直接调用magic dunder函数。所以,你的超级…。uuu setattr_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这件事没有理由 顺便说一句,根据我的经验,当人们开始使用描述符时,这是一种默认的障碍。以非动态方式使用描述符时

class Container(object):
    foo = Item('foo')
    bar = Item('bar')
您正在类的范围内设置foo和bar——字面上是类属性。但在你的动态方式中,你是用实例来做的。Idk,如果您试图将其设置为类,但如果这是一个意图,super不会这样工作。若要动态设置附加描述符,您需要将其附加到self在_init_;内引用的实例的类。要执行此操作,请访问self.\uuuuu类\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,您的代码可能看起来像

class Container(object):
    def __init__(self, data):
        for attr in data:
            setattr(type(self), attr, Item(attr))

我用你的意见完全重写了这个问题。你能更新你的答案吗?我有一个类将被调用多次,每个类都应该有唯一的属性。有没有一种方法我可以做到这一点,而不用在_uinit__;中定义类?请为您的案例创建单独的问题,当您期望具体的答案时,很难回答抽象的问题;请不要。不要做一个傻子。使现有答案无效的主要编辑受到社区的反对。@AndrasDeak那么什么解决方案呢?我的问题是不清楚的,我不能删除它,我也不能在同一个错误的方向追求。我的要求不同。最终,最初的目标是一样的。我没有彻底阅读你的问题和编辑,我只看到一个4k代表用户问了一个问题,然后留下关于完全重写问题的评论,随后其中一个答案被删除。如果你认为原来的问题不清楚,现有的问答对也没有任何意义,那没关系。我只是想让你有意识地意识到重写问题的问题,因为太多的用户没有这样做。