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!