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

时间:2018-07-02 02:15:00

标签: python python-3.x oop

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

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

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

EX:

getattr()

class emp:     name ='严酷'     薪水='25000'     def show(个体):         打印self.name         打印自我工资 e1 = emp() 打印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

1 个答案:

答案 0 :(得分:1)

在python中,我们通常do not use getter and setter methods,而不是尽可能地直接获取和设置属性,因为它比通过getter和setter方法对值的中间访问要简单和直观得多。

在(非常)罕见的情况下,您确实需要动态设置和获取器,@property装饰器是定义可通过.表示法使用的动态设置和获取器的首选方法:

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____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

与上面的示例功能相同。