我想知道如何让所有从dataObj(Two和One)继承的实例修改.data
的{{1}}属性:
当我修改一个或两个实例的.data时,我希望这个更改缓冲区实例的.data。
在顺序中,如何使self.buffer
成为.data
的所有实例的全局,因此当我在其中一个实例中更改dataObj
时,它会对所有实例应用更改。< / p>
.data
输出:
class dataObj():
def __init__(self, data):
self.data = data
def read(self, width):
self.data = self.data[width:]
class One(dataObj):
def __init__(self, data):
self.data = data
def deserialize(self):
self.read(1)
class Two(dataObj):
def __init__(self, data):
self.data = data
def deserialize(self):
self.read(2)
class msg():
def __init__(self):
self.buffer = dataObj('0123456789')
def run(self):
print("buffer.data = ", self.buffer.data)
one = One(self.buffer.data)
one.deserialize()
print("one.data = ",one.data)
two = Two(self.buffer.data)
two.deserialize()
print("two.data = ", two.data)
print("buffer.data = ", self.buffer.data)
main = msg()
main.run()
我想要的输出:
buffer.data = 0123456789
one.data = 123456789
two.data = 23456789
buffer.data = 0123456789
我必须考虑使用class属性 像这样的东西:
buffer.data = 0123456789
one.data = 123456789
two.data = 3456789
buffer.data = 3456789
但我不知道如何修改这个类属性。
答案 0 :(得分:2)
在Python str
中,对象是不可变的;所以
a = 'hello world'
b = a
您无法对b
更改a
的值;更改a
值的唯一方法是重新分配a
。
如果对于缓冲区而是使用可变对象(例如list
),那么您需要进行两个简单的更改:
def read(self, width):
self.data[:] = self.data[width:] # note the [:] part
...
self.buffer = dataObj(list('0123456789')) # list
一个关键点是声明
self.data[:] = self.data[width:]
与简单分配不同,因为它会改变列表内容,而另一个实例会看到更改。
改为编写
self.data = self.data[width:]
使用剩余部分创建一个新的列表对象,而不触及另一个实例指向的原始列表对象。
通过这两项更改,输出变为:
buffer.data = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
one.data = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
two.data = ['3', '4', '5', '6', '7', '8', '9']
buffer.data = ['3', '4', '5', '6', '7', '8', '9']
答案 1 :(得分:1)
你可以试试这个
class data:
val = ''
def __init__(self, value):
data.val = value
def printval(self):
print(self.val)
现在变量val在所有实例之间共享。
d1 = data('addingfromd1')
d1.printval()
d2 = data('addingfromd2')
d1.printval() --> This will print latest value "addingfromd2"
答案 2 :(得分:1)
使用一个单独的类,如建议here可能是一个更好的主意,但如果你试图用类方法做它,它可以实现:
class dataObj():
data = None
@classmethod
def read(cls, width):
dataObj.data = dataObj.data[width:]
class One(dataObj):
@classmethod
def deserialize(cls):
dataObj.read(1)
class Two(dataObj):
@classmethod
def deserialize(cls):
dataObj.read(2)
class msg():
def __init__(self):
dataObj.data = '0123456789'
self.buffer = dataObj()
def run(self):
print("buffer.data = ", self.buffer.data)
one = One()
one.deserialize()
print("one.data = ",one.data)
two = Two()
two.deserialize()
print("two.data = ", two.data)
print("buffer.data = ", self.buffer.data)
main = msg()
main.run()
这里所有子类都在更新dataObj()
中定义的相同类变量。