Python中的set和setattr有什么区别?什么时候应该使用?

2024-04-24 09:17:02 发布

您现在位置:Python中文网/ 问答频道 /正文

正如标题所说。

来自Java im过去:

private int A;

public void setA(int A) {
    this.A = A;
}

public int getA() {
    return this.A
}

如果需要的话,我应该如何在Python中做到这一点。 如果__setattr____set__中的一个用于此,另一个用于什么?

编辑: 我觉得我需要澄清一下。我知道在Python中,doe不会在需要setter和getter之前创建它们。

假设我想做这样的事情:

public void setA(int A) {
    update_stuff(A);
    and_calculate_some_thing(A);
    this.A = A;
}

什么是“Python”的方式来实现这一点?


Tags: 编辑标题returnjavaprivatepublicthisint
3条回答

当描述符被分配给时,__set__()在描述符中使用。__setattr__()用于绑定到对象的属性。除非创建描述符,否则不会使用__set__()

在python中,类似这样的应该使用property实现(然后只有当它们做一些有用的事情时)。

class Foo(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self,y):
        self._x = y

在这个例子中,最好这样做(正如爱德华指出的那样):

class Foo(object):
     def __init__(self):
         self.x = None

因为我们的getter/setter方法实际上什么也做不了。。。但是,当setter/getter实际上不仅仅是赋值/返回属性值时,属性变得非常有用。

它也可以使用__setattr__/__getattr__来实现(但不应该这样实现,因为如果类有多个属性,它会很快变得很麻烦。我还认为这样做比使用属性要慢:

class Foo(object):
    def __init__(self):
        self._x = None
    def __setattr__(self,attr,obj):
        if(attr == 'x'):
            object.__setattr__(self,'_x',obj)
        else:
            object.__setattr__(self,attr,obj)

    def __getattr__(self,attr):
        if(attr == 'x'):
            return object.__getattr__(self,'_x')
        else:
            return object.__getattr__(self,attr)

__setattr____getattr__实际做什么而言。。。 __setattr__/__getattr__是当您执行以下操作时调用的:

myclassinstance = MyClass()
myclassinstance.x = 'foo'  #translates to MyClass.__setattr__(myclassinstance,'x','foo')
bar = myclassinstance.x    #translates to bar=MyClass.__getattr__(myclassinstance,'x')

至于__get____set__previous posts讨论得很好。

注意,在python中没有私有变量。一般来说,在一个以下划线为前缀的类成员中,您不应该弄乱它(除非您知道自己在做什么)。如果它的前缀是2个下划线,它将调用名称管理,这使得在类之外访问变得更加困难。这用于防止继承中的名称空间冲突(而且这些变量通常也不会被弄乱)。

如果getter/setter真的像那样微不足道,那么您甚至不必为它们操心:只需使用一个实例变量。如果您确实需要一个getter/setter来做一些有趣的事情,那么您应该切换到一个属性,如mgilson所描述的。请注意,您可以从实例变量更改为属性,而无需使用代码来注意差异。一、 e.从:

class Foo(object):
    def __init__(self):
        self.x = None

只有当您需要在获取/设置属性时发生有趣的事情时,才会更改基于属性的访问器mgilson。

相关问题 更多 >