首页 > 解决方案 > 如何通过简单的设置和获取属性在类中初始化一个值?

问题描述

我一直在使用的类看起来很简单,像这样:

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

标签: pythonclass

解决方案


如果我理解正确,您的最终目标是拥有一个可以从 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 关键字的名称。


推荐阅读