Python 设置自定义对象属性

Python 设置自定义对象属性,python,class,python-3.x,Python,Class,Python 3.x,我正在处理继承的类,不知道是否可以使用方法设置自定义对象属性。 它的工作原理如下: class MyClass(object): def __init__(self): super.__init__() def setCustAttr(self, name, value): #... g=MyClass() g.setCustAttr("var",5) g.var+=6 g.var="text" 有没有办法做到这一点 您能使用exec(“sel

我正在处理继承的类,不知道是否可以使用方法设置自定义对象属性。 它的工作原理如下:

class MyClass(object):
    def __init__(self):
        super.__init__()
    def setCustAttr(self, name, value):
        #...
g=MyClass()
g.setCustAttr("var",5)
g.var+=6
g.var="text"
  • 有没有办法做到这一点
  • 您能使用exec(“self.”+string+“=”+value)

    • 这就是
      setattr
      函数的作用:

      setattr(g, 'var', 5)
      # g.var is now 5
      

      传递给
      setCustAttr
      的参数正是传递给
      setattr
      的参数

      def setCustAttr(self, name, value):
          setattr(self, name, value)
      
      为什么要在
      setattr
      周围使用包装器?您可以尝试执行一些验证:

      def setCustAttr(self, name, value):
          if name not in ['bar', 'baz']:
              raise ValueError("Custom attribute must be 'bar' or 'baz'")
          if name == 'bar' and value < 0:
              raise ValueError("'bar' attribute must be non-negative")
          if name == 'baz' and value % 2:
              raise ValueError("'baz' attribute must be even")
      
          setattr(self, name, value)
      

      Python具有强大的魔力,可以提供对对象属性设置方式的更多控制(请参见
      \uuuuuu slots\uuuuuuu
      \uuuu{get,set}attr\uuuuuu
      \uuuuu getattribute\uuuuuuuu
      、属性等),但通常,它们不仅仅用于阻止上面所示的示例。Python的方法是记录类的实例应该如何使用,并信任用户遵守您的说明。(如果他们不这样做,请向买主提出警告。)

      可能重复的问题,而不是重复的问题。这个问题是关于
      setattr
      object
      s上失败的。这很可能是其他方法的重复。我假设你的意思是除了
      g.var=5
      ?因此不需要其他方法?不需要。您可以使用这样的包装器来提供验证
      g.setCustAttr(“var”,5)
      可能首先检查该值是否大于0(如果不大于0,则引发
      ValueError
      ),或者第一个参数是否来自一组受限制的名称(模拟
      \uuuuu slots\uuu
      属性的部分功能)。但是,您的类的用户仍然可以忽略您的方法并编写
      g.var=5
      ,因此您可以在设置之前计算新值。谢谢
      g = MyClass()
      g.bar = -5  # Negative bar!
      g.baz = 3   # Odd baz!
      g.quux = 2  # Non-bar/baz attribute!