python - 如何通过简单的设置和获取属性在类中初始化一个值?
问题描述
我一直在使用的类看起来很简单,像这样:
class Transaction(dict):
__getattr__ = dict.get
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
然后发送:
transaction = Transaction({"to": "0x000", "from": "0x001": "timestamp": 1234})
当然可以这样使用transaction.to
,但是它看起来transaction.from
不起作用,因为from
它是一个python保留关键字
所以我很好奇使用那个简单的类,有没有办法from
在类中重新分配类似于
self.sender = dict.from
我一直在尝试,__init__
但没有运气
我也只用一个编写了这个类__init__
,然后使用self
但没有一个getter分配所有值,这个类是不可迭代的
我一直在做的事情看起来像这样
# given data - {"to": "0x000", "from": "0x001": "timestamp": 1234}
item["sender"] = item["from"]
transaction = Transaction(item)
然后我像参考它一样transaction.sender
。
解决方案
如果我理解正确,您的最终目标是拥有一个可以从 dict 实例化并将键作为属性公开的类。我推断 dict 只能包含某些键,因为您正在谈论映射"from"
到sender
. 在那种情况下,我会完全不同地这样做:不要子类化dict
,而是有一个可以处理字典的替代构造函数。我会保留一个“正常”的构造函数,主要是为了代表。
例如:
class Transaction:
def __init__(self, to, from_, timestamp):
self.to = to
self.from_ = from_
self.timestamp = timestamp
@classmethod
def from_dict(cls, d):
return cls(d['to'], d['from'], d['timestamp'])
def __repr__(self):
"""Show construction."""
r = '{}({!r}, {!r}, {!r})'.format(
type(self).__name__,
self.to,
self.from_,
self.timestamp)
return r
transaction = Transaction.from_dict({"to": "0x000", "from": "0x001", "timestamp": 1234})
print(transaction) # -> Transaction('0x000', '0x001', 1234)
print(transaction.from_) # -> 0x001
在这里,我使用PEP 8 中涵盖的尾随下划线约定:
single_trailing_underscore_
: 按照惯例使用以避免与 Python 关键字冲突,例如tkinter.Toplevel(master, class_='ClassName')
顺便说一句,如果有用,该keyword
模块包含所有 Python 关键字的名称。