Python-Can';t更改类内项的值

Python-Can';t更改类内项的值,python,json,Python,Json,我是Python新手,不明白为什么我不能这么做。 当我试图从父对象更改Packet.ItemData中的值时,它不起作用。请参阅代码中的“不工作”注释 import json from copy import deepcopy class Event(): __slots__= 'itemName' def __init__(self, itemName): self.itemName = itemName def encode(self):

我是Python新手,不明白为什么我不能这么做。 当我试图从父对象更改Packet.ItemData中的值时,它不起作用。请参阅代码中的“不工作”注释

import json
from copy import deepcopy


class Event():
    __slots__= 'itemName'

    def __init__(self, itemName):
        self.itemName = itemName


    def encode(self):
        obj = {}
        obj['itemName'] = str(self.itemName)               
        return json.dumps(obj)

    def decode(self, json_Str):
        obj = json.loads(json_Str)
        self.itemName = obj['itemName']        



class Packet():
    __slots__= 'pID', 'itemData' 

    def __init__(self, pID, itemData):
        self.pID = pID
        self.itemData = itemData

    def encode(self):
        obj = {}
        obj['pID'] = int(self.pID)
        obj['itemData'] = str(self.itemData.encode())

        return json.dumps(obj)

    def decode(self, json_Str):
        obj = json.loads(json_Str)
        self.pID = obj['pID']
        self.itemData = Event(0,'')


defaultEvent = Event('Dflt')
defaultPacket = Packet(1, defaultEvent)



event2 = Event('NoName')
print 'event : ', event2.encode()
packet3 = deepcopy(defaultPacket)
packet3.ItemData = event2; #direct assign doesn't work
packet3.ItemData = deepcopy(event2); #deep copy doesn't work
packet3.ItemData.itemName = 'Hello' #event this doesn't work
print 'packet : ', packet3.encode()

我想包装数据,以便在从JSON编码和解码时得到我所期望的结果。

属性名称是
itemData
,而不是
itemData
。如果将所有的
packet3.ItemData
引用更改为
packet3.ItemData
,这应该可以正常工作。

属性名称是
ItemData
,而不是
ItemData
。如果您将所有
packet3.ItemData
引用更改为
packet3.ItemData
,这应该可以正常工作。

FJ指出的确实正确…属性的名称是
ItemData
而不是
ItemData

作为Python新手,您可能已经预料到输入错误会引发错误……类似于“packethasnoattributeitemdata”之类的错误,但这并没有发生。默认情况下,Python类将属性存储在字典中,因此分配给以前不存在的属性就像向字典添加新映射一样

奇怪的是,您的代码以一种迂回的方式突出显示了一个例外……这与描述符
\uuuuu插槽\uuuu
有关<代码>\uuuu插槽\uuuu将类更改为不再在动态字典中存储属性,而是在静态结构中存储属性。有关更多信息,请参阅

通常,当定义了
\uuuuuu slots\uuuuuu
时,您不能将未在
\uuuuuuu slots\uuuu
中指定的属性分配给该属性。所以你可能会问……既然你为你的类定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,为什么你没有得到一个
属性错误?答案是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


您是否定义了
Packet
从基类
object
继承,就像
class Packet(object):
而不是
class Packet()
它会使它成为一个新型的类,当您试图分配给
ItemData
时,您确实会得到一个
AttributeError
,FJ指出的确实是正确的…属性的名称是
ItemData
而不是
ItemData

作为Python新手,您可能已经预料到输入错误会引发错误……类似于“packethasnoattributeitemdata”之类的错误,但这并没有发生。默认情况下,Python类将属性存储在字典中,因此分配给以前不存在的属性就像向字典添加新映射一样

奇怪的是,您的代码以一种迂回的方式突出显示了一个例外……这与描述符
\uuuuu插槽\uuuu
有关<代码>\uuuu插槽\uuuu
将类更改为不再在动态字典中存储属性,而是在静态结构中存储属性。有关更多信息,请参阅

通常,当定义了
\uuuuuu slots\uuuuuu
时,您不能将未在
\uuuuuuu slots\uuuu
中指定的属性分配给该属性。所以你可能会问……既然你为你的类定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,为什么你没有得到一个
属性错误?答案是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


如果您将
Packet
定义为继承基类
对象,比如
class Packet(object):
而不仅仅是
class Packet()
,它将使它成为一个新样式的类,并且当您试图分配给
ItemData

时,您确实会得到一个
AttributeError
,谢谢,我讨厌蔡斯,所以用帕斯卡。我试图使用插槽来防止额外的数据进入。谢谢,我讨厌追逐敏感,所以使用pascal。我试图使用插槽来防止额外的数据出现在那里。