@property、@property.setter 和 getattr()、setattr() 有什么区别。我什么时候会使用它们?如果两者相同,在 python 3.x 中首选使用哪一个?
我是 python 新手,不了解在哪里使用以及如何将它们与 OO python 一起使用
我浏览了很多网站,但不知道该使用哪一个。请给我一些实时的例子。感谢您的帮助。
例如:
getattr()
class emp:
name='Harsh'
salary='25000'
def show(self):
print self.name
print self.salary
e1 = emp()
print getattr(e1,'name')
setattr(e1,'height',152)
@ property
class P:
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中,我们通常不使用
getter
和setter
方法,而是更喜欢尽可能直接获取和设置属性,因为它比通过getter和setter方法来访问值要简单和直观得多。
在(相当)罕见的情况下,您确实需要动态 setter 和 getter,
@property
装饰器是定义动态 setter 和 getter 的首选方式,可以通过 .
表示法使用:
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
这些可以与
getattr
和 setattr
配合使用,允许您通过属性名称动态访问对象的属性:
foo = Foo()
getattr(foo, "x") # 0
setattr(foo, "x", 1) # Same as foo.x = 1
foo.x # 1
一个更恰当的问题可能是
@property
和 __getattr__
和 __setattr__
之间的区别是什么,它们允许类似于 property
的动态属性访问,但对于任何可能的名称:
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
其功能与上面的示例相同。