如何按值获取 Python class 属性?
How to get Python class attribute by value?
如何通过值而不是通过引用获取 Python 中的对象属性?我的意思是,在获取对象属性并将其赋值给一个变量后,该变量不应该跟踪该属性可能发生的变化。
这是一个例子:
class SomeClass:
def __init__(self):
self.array = []
def add(self):
self.array.append(1)
def getValue(self):
return self.array
s = SomeClass()
v = s.getValue()
print(v) # prints [], as it should
s.add() # changes the object's attribute
print(v) # prints [1], because v is tracking s.array
# how to implement a getter that would keep v the value when it was assinged?
我可以使用 copy.deepcopy()
部分解决这个问题,但这并不适用于所有数据类型(例如套接字对象)。
我相信你对python的工作原理有一些误解。
Python 通过引用
- python 中的一切都是对象。甚至原始数据类型(例如
int
、str
、...)也是。
- 任何变量始终是对对象的引用。没有办法只传递值。
你可以试试下面的练习
a = [1, 2] # creating new object and assigning it to `a`
b = a # now both `a` and `b` refer to same object
a.append(3) # we add 3 to the list, `a` and `b` still refer to same object
a is b # this returns `True` as we compare object to itself
a = [100] # creating new object and making `a` to refer to it
a is b # now this is `False`, `b` still refers to the old object
有些对象是不可变的
另一个python概念是不变性。不可变对象是那些一旦创建就永远不会改变其值的对象。您只能用不同的对象替换它们。
最常见的类型是:
- 不可变:
int
、str
、float
、tuple
、frozenset
、bytes
- 可变:
list
、dict
、set
在 python 中,传递不可变对象与按值传递一样接近。因为您可以确定它不会受到任何影响。当你需要传递可变对象并且你想确保它不会被改变时,你可以复制。
如何通过值而不是通过引用获取 Python 中的对象属性?我的意思是,在获取对象属性并将其赋值给一个变量后,该变量不应该跟踪该属性可能发生的变化。
这是一个例子:
class SomeClass:
def __init__(self):
self.array = []
def add(self):
self.array.append(1)
def getValue(self):
return self.array
s = SomeClass()
v = s.getValue()
print(v) # prints [], as it should
s.add() # changes the object's attribute
print(v) # prints [1], because v is tracking s.array
# how to implement a getter that would keep v the value when it was assinged?
我可以使用 copy.deepcopy()
部分解决这个问题,但这并不适用于所有数据类型(例如套接字对象)。
我相信你对python的工作原理有一些误解。
Python 通过引用
- python 中的一切都是对象。甚至原始数据类型(例如
int
、str
、...)也是。 - 任何变量始终是对对象的引用。没有办法只传递值。
你可以试试下面的练习
a = [1, 2] # creating new object and assigning it to `a`
b = a # now both `a` and `b` refer to same object
a.append(3) # we add 3 to the list, `a` and `b` still refer to same object
a is b # this returns `True` as we compare object to itself
a = [100] # creating new object and making `a` to refer to it
a is b # now this is `False`, `b` still refers to the old object
有些对象是不可变的
另一个python概念是不变性。不可变对象是那些一旦创建就永远不会改变其值的对象。您只能用不同的对象替换它们。
最常见的类型是:
- 不可变:
int
、str
、float
、tuple
、frozenset
、bytes
- 可变:
list
、dict
、set
在 python 中,传递不可变对象与按值传递一样接近。因为您可以确定它不会受到任何影响。当你需要传递可变对象并且你想确保它不会被改变时,你可以复制。