gpt4 book ai didi

实例变量的 Pythonic 别名?

转载 作者:行者123 更新时间:2023-11-28 22:03:32 26 4
gpt4 key购买 nike

我有一个类,出于继承原因,我在其中将数据存储在列表中。我想知道,并且我已经完成了谷歌搜索,除了创建 getter/setter 函数和属性来为该列表中的元素提供别名之外,还有更简洁的方法吗?

例如……

class Serializable(object):
"""Adds serialization to from binary string"""

def encode(self):
"""Pack into struct"""
return self.encoder.pack(*self)

def decode(self, data_str):
"""Unpack from struct"""
self.data = self.encoder.unpack(data_str)
return self.data


class Ping(Serializable):

encoder = Struct("!16sBBBL")

def __init__(self, ident=create_id(), ttl=TTL, hops=0, length=0):
self.data = [ident, 1, ttl, hops, length]
self.ident = property(self.data[0])

def __getitem__(self, index):
return self.data[index]

@property
def ident(self):
return self.data[0]

@ident.setter
def ident(self, value):
self.data[0] = value

@property
def protocol(self):
return self.data[1]

@protocol.setter
def protocol(self, protocol):
self.data[1]

我更喜欢引用 object.ident 的更紧凑的解决方案,同时保持上述打包和解包的能力。

最佳答案

如果您将值/属性存储在字典中:

def __init__(self, ident=create_id(), ttl=TTL, hops=0, length=0):
self.data = {
'ident': ident,
'protocol': 1,
'ttl': hops,
'length': length,
}

然后覆盖__getattr____setattr__:

def __getattr__(self, attr):
return self.data[attr]
def __setattr__(self, attr, value):
if attr == 'data':
object.__setattr__(self, attr, value)
else:
self.data[attr] = value

现在你可以这样做了:

>>> ping = Ping()
>>> ping.protocol
1
>>> ping.protocol = 2
>>> ping.protocol
2

如果 self.data 绝对必须是一个列表,您可以这样做:

class Ping(Serializable):

mapping = ('ident', 'protocol', 'ttl', 'hops', 'length')

encoder = Struct("!16sBBBL")

def __init__(self, ident=create_id(), ttl=TTL, hops=0, length=0):
self.data = [ident, 1, ttl, hops, length]

def __getitem__(self, index):
return self.data[index]

def __getattr__(self, attr):
index = self.mapping.index(attr)
return self.data[index]

def __setattr__(self, attr, value):
if attr == 'data':
object.__setattr__(self, attr, value)
else:
index = self.mapping.index(attr)
self.data[index] = value

关于实例变量的 Pythonic 别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8981189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com