Python无法更改类中item的值

2024-10-01 00:21:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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进行编码和解码时得到我所期望的结果。你知道吗


Tags: selfeventjsonobjpacketdefpidencode
2条回答

FJ指出的确实正确…属性的名称是itemData而不是ItemData。你知道吗

作为Python的新手,您可能期望输入错误会引发错误……类似于“Packet has no attribute ItemData”之类的错误,但这不会发生。默认情况下,Python类将属性存储在字典中,因此将属性分配给以前不存在的类就像向字典添加新映射一样。你知道吗

奇怪的是,您的代码以一种迂回的方式突出显示了一个例外……这与描述符__slots__有关。__slots__将类更改为不再在动态字典中存储属性,而是在静态结构中存储属性。有关详细信息,请参见Usage of __slots__?。你知道吗

通常,在定义__slots__时,不能将未在__slots__中指定的属性赋值。所以你可能会问…既然你为你的类定义了__slots__,为什么你没有得到一个AttributeError?答案是__slots__只适用于“新样式类”,请参见What is the difference between old style and new style classes in Python?了解新旧样式类之间的区别。你知道吗

如果您将Packet定义为从基类object继承,比如class Packet(object):,而不是仅仅class Packet(),那么它将成为一个新样式的类,并且当您尝试分配给ItemData时,确实会得到一个AttributeError

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

相关问题 更多 >