关于python,@property和getattr()有什么区别?

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中,我们通常不使用gettersetter方法,而是尽可能直接获取和设置属性,因为它比通过getter和setter方法中介访问值更简单和直观。

在您确实需要动态setter和getter的(相当)罕见的情况下,@propertydecorator是定义动态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

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

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

一个更为恰当的问题可能是,@property__getattr____setattr__之间的区别是什么,允许类似于property的动态属性访问,但对于任何可能的名称:

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

其功能与上述示例相同。