gpt4 book ai didi

python - Python 中的 __set__ 和 __setattr__ 有什么区别,应该在什么时候使用?

转载 作者:太空狗 更新时间:2023-10-29 17:23:20 28 4
gpt4 key购买 nike

正如标题所说。

来自 Java 我曾经:

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;
}

实现它的“pythonic”方法是什么?

最佳答案

在 python 中,像这样的东西应该使用属性来实现(然后只有当它们做一些有用的事情时)。

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

在这个例子中,最好只做(正如 Edward 所指出的):

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

因为我们的 getter/setter 方法实际上并没有做任何事情......但是,当 setter/getter 实际做的不仅仅是分配/返回属性值的事情时,属性会变得非常有用。

它也可以使用 __setattr__/__getattr__ 来实现(但它不应该以这种方式实现,因为如果你的类有超过 1 个属性,它很快就会变得很麻烦。我也猜想这样做会比使用属性慢):

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 中没有私有(private)变量这样的东西。一般来说,在一个类成员中,前缀是下划线,你不应该乱用它(当然除非你知道你在做什么)。如果它的前缀是 2 个下划线,它将调用名称修改,这使得在类之外访问变得更加困难。这用于防止继承中的 namespace 冲突(并且这些变量通常也不能被弄乱)。

关于python - Python 中的 __set__ 和 __setattr__ 有什么区别,应该在什么时候使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10707206/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com