@property 和 getattr() 有什么区别?



@property、@property.setter 和 getattr((、setattr(( 有什么区别。我什么时候会使用它们?如果两者相同,那么在python 3.x中最好使用哪一个?

我是 python 的新手,不明白在哪里使用以及如何将它们与 OO python 一起使用

我浏览过很多网站,但我不确定要使用哪个网站。请给我一些实时的例子。感谢您的帮助。

前任:

getattr((

类 emp: 名称="苛刻" 薪水='25000' DEF 显示(个体经营(: 打印 self.name 打印自我工资 e1 = emp(( Print getattr(E1,'Name'( 塞塔特(E1,'高度',152( @ 属性

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中,我们通常不使用gettersetter方法,而是尽可能直接获取和设置属性,因为它比通过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

这些可以与getattrsetattr一起使用,这允许您通过属性名称动态访问对象的属性:

foo = Foo()
getattr(foo, "x")    # 0
setattr(foo, "x", 1) # Same as foo.x = 1
foo.x       # 1

一个更合适的问题可能是@property__getattr__以及允许类似于property但任何可能的名称的动态属性访问的__setattr__之间的区别是什么:

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

其功能与上述示例相同。

最新更新