gpt4 book ai didi

Python:self 与 type(self) 以及类变量的正确使用

转载 作者:行者123 更新时间:2023-12-01 22:35:13 25 4
gpt4 key购买 nike

在 Python 中使用类变量时,可以通过“self”(由于引用)或“type(self)”(直接)访问和(如果它是可变的)直接操作它,而不可变变量(例如,整数) 显然会在您仅使用“self”时被新实例对象遮蔽。

那么,在处理 Python 类变量时,是否更可取/Python 总是简单地使用“type(self)”来处理从类方法中引用的类变量?

(我知道类变量有时不受欢迎,但当我使用它们时,我希望以一致的方式访问它们(如果它们是不可变类型则以一种方式访问​​它们,如果它们是可变类型则以另一种方式访问​​它们。)

编辑:是的,如果您修改一个不可变的值,您会得到一个新对象。修改可变对象值的副作用是导致这个问题的原因——“self”会给你一个引用,你可以用它来改变类变量而不影响它,但是如果你给它分配一个新对象它会影响它。使用 classname.classvar 或 type(self).classvar 或 self.__class__ 可确保您始终使用类变量,而不仅仅是隐藏它(尽 pipe 类会使这一点复杂化,如下所述)。

最佳答案

您可能希望使用实际类型名称访问它们,而不是 selftype(self)

您看到的效果与可变性无关。如果你要这样做

class Foo(object):
x = []
def __init__(self):
self.x = [1]

__init__ 中的赋值将创建一个新列表并将其分配给实例属性 x,忽略类属性,即使 Foo.x 是一个可变对象。每当你想分配给一个属性时,你需要使用它实际定义的对象。

注意在继承的情况下通过type(self)修改属性失败:

class Foo(object):
x = 1
def modify_x(self, x):
type(self).x = x

class Bar(Foo): pass

Foo().modify_x(2) # modifies Foo.x
Bar().modify_x(3) # modifies Bar.x, the wrong attribute

关于Python:self 与 type(self) 以及类变量的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24923749/

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