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

-3 python oop python-3.x

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

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

我浏览了很多网站,但不知道该使用哪一个。请给我一些实时的例子。感谢你的帮助。

前任:

获取属性()

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 ) @ 财产

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
Run Code Online (Sandbox Code Playgroud)

Mat*_*ory 8

在Python中,我们通常不使用getterandsetter方法,而是尽可能直接获取和设置属性,因为它比通过 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
Run Code Online (Sandbox Code Playgroud)

getattr这些可以与和配合使用setattr,允许您通过属性名称动态访问对象的属性:

foo = Foo()
getattr(foo, "x")    # 0
setattr(foo, "x", 1) # Same as foo.x = 1
foo.x       # 1
Run Code Online (Sandbox Code Playgroud)

@property一个更恰当的问题可能是 a和__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
Run Code Online (Sandbox Code Playgroud)

其功能与上面的示例相同。