What is the difference between @property and getattr()?
@property、@property.setter和getAttr()、setAttr()之间的区别是什么?我什么时候用?如果两者都相同,在python 3.x中首选哪一个?
我对python不熟悉,不知道在哪里使用以及如何将它们与oo python一起使用。
我浏览过很多网站,但我不知道该用哪一个。请给我一些实时的例子。谢谢你的帮助。
前任:
GETAdter()
类电磁脉冲:名字="苛刻"薪水=25000DEF显示(自我):打印自己的名字打印本人工资E1=空()打印getattr(e1,'name')setattr(e1,"高度",152)@房产
P类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def __init__(self,x): self.x = x @property def x(self): return self.__x @x.setter def x(self, x): if x < 0: self.__x = 0 elif x > 1000: self.__x = 1000 else: self.__x = x |
在python中,我们通常不使用
在您确实需要动态setter和getter的(相当)罕见的情况下,
1 2 3 4 5 6 7 8 9 10 11 | class Foo: def __init__(self, x=None): self.x = x @property def x(self): return self._x @x.setter def x(self, value): self._x = value or 0 |
这些可以与
1 2 3 4 | foo = Foo() getattr(foo,"x") # 0 setattr(foo,"x", 1) # Same as foo.x = 1 foo.x # 1 |
一个更为恰当的问题可能是,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Foo(object): def __init__(self, x=None): self._other_values = {} self.x = x def __getattr__(self, k): try: return self._other_values[k] except KeyError: raise AttributeError(k) def __setattr__(self, k, v): if k =="_other_values": return super(Foo, self).__setattr__(k,v) if k =="x": v = v or 0 self._other_values[k] = v |
其功能与上述示例相同。