Python 如何为类动态设置任意属性?

Python 如何为类动态设置任意属性?,python,Python,我试图认识到这一点,只是想看看是否有可能: 下面是我当前的解决方案: class A(object): def fset(self, x, value): self.__dict__.update({x:value}) def fget(self, x): return self.x def fdel(self, x): del self.x 但它并不完整,例如,fget和fdel函数不能很好地工作 >>&

我试图认识到这一点,只是想看看是否有可能:

下面是我当前的解决方案:

class A(object):
    def fset(self, x, value):
        self.__dict__.update({x:value})
    def fget(self, x): 
        return self.x
    def fdel(self, x): 
        del self.x
但它并不完整,例如,fget和fdel函数不能很好地工作

>>> a = A()
>>> a.fset('z', 5)
>>> a.z
5
>>> a.fget('z')
'A' object has no attribute 'x'
>>> a.fget(z)
name 'z' is not defined
>>> a.fdel(z)
NameError: name 'z' is not defined
>>> a.fdel('z')
AttributeError: x

如何修复它?

Python已经自己解决了这一问题:

>>> class A(object):
    pass

>>> a = A()
>>> setattr(a, 'z', 5)
>>> a.z
5
>>> getattr(a, 'z')
5
>>> delattr(a, 'z')
>>> a.z
AttributeError: 'A' object has no attribute 'z'

阅读有关Python的文档以了解更多详细信息。

Python本身已经做到了这一点:

>>> class A(object):
    pass

>>> a = A()
>>> setattr(a, 'z', 5)
>>> a.z
5
>>> getattr(a, 'z')
5
>>> delattr(a, 'z')
>>> a.z
AttributeError: 'A' object has no attribute 'z'

阅读有关Python的文档以了解更多详细信息。

PythonIndeed默认情况下已将其内置到类和对象中

您的示例是:

class A(object):

    def fset(self, x, value):
        setattr(self, x, value)

    def fget(self, x): 
        return getattr(self, x)

    def fdel(self, x): 
        delattr(self, x)

NB:这些简单地围绕
getattr
setattr
delattr
内置项的方法没有什么好处。

Python Indeed默认情况下已经将其内置到类和对象中

您的示例是:

class A(object):

    def fset(self, x, value):
        setattr(self, x, value)

    def fget(self, x): 
        return getattr(self, x)

    def fdel(self, x): 
        delattr(self, x)

NB:这些简单地围绕
getattr
setattr
delattr
内置项的方法没有什么好处。

我是OP,我在python官方文档上找到了一个可以做我想做的事情的例子

让我们来研究一下:

>>> c = C()
>>> c.yyy = 123
>>> c.yyy
123
>>> del c.yyy
>>> c.yyy
AttributeError: 'C' object has no attribute 'yyy'

我是OP,我在python官方文档上找到了一个例子,它可以做我想做的事情

让我们来研究一下:

>>> c = C()
>>> c.yyy = 123
>>> c.yyy
123
>>> del c.yyy
>>> c.yyy
AttributeError: 'C' object has no attribute 'yyy'

实际上,这些内置程序本身只是包装对象本身的“神奇”方法。它们可以被重写以实现自定义行为。我不打算走那么远,但是是的:)事实上,那些内置程序本身只是包装对象本身的“magic”方法
\uuuuuuuuuGetAttribute\uuuuuuuuuuuuu
\uuuuuuuuuuuuuuu setattr\uuuuuuuuuuuuuu
。它们可以被重写以实现自定义行为。我不打算走那么远,但可以:)