我怎样才能编辑一个类attribut

时间:2017-07-30 05:56:58

标签: python python-3.x

我想知道如何让所有从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

但我不知道如何修改这个类属性。

3 个答案:

答案 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()中定义的相同类变量。