【问题标题】:How to define a method like int.from_bytes() in Python?如何在 Python 中定义像 int.from_bytes() 这样的方法?
【发布时间】:2013-06-21 11:44:17
【问题描述】:

在python中有一个int类型的方法,即int.from_bytes。它不是特定 int 上的方法,而是类型上的方法。例如

>>> int.from_bytes(b'\xee\xff',"big")
61183

>>> int.from_bytes
<built-in method from_bytes of type object at 0x107fdb388>

我如何定义这样的东西?假设定义了一个名为“point”的类,我该如何定义类似

>>> point.from_coordinates(3,5)
<__main__.point object at 0x10c0c9310>

>>> point.from_keys(b'\x12\x3e')
<__main__.point object at 0x10bed5890>

? (假设点是通过一些不同的方法初始化的。)

【问题讨论】:

标签: python class methods python-3.x


【解决方案1】:

你想要classmethod,通常用作装饰器:

class point(object):
    @classmethod
    def from_coordinates(cls, x, y):
        pt = cls()
        pt.x, pt.y = x, y
        return pt

这有时被称为“替代构造函数”习语。如果有多种不同的方法来构造你的类型,不要将它们全部放入一个带有一堆可选参数或可变参数的 __init__ 方法中,而是将它们全部放入单独的 classmethods 中。

【讨论】:

    【解决方案2】:

    您可以使用classmethod,例如模拟示例,其init 需要整数,但也提供了一个方便的from_hex,它尝试获取字符串并将它们转换为整数...

    class MyClass(object):
        def __init__(self, a, b):
            self.a = a
            self.b = b
        @classmethod
        def from_hex(cls, a, b):
            return cls(int(a, 16), int(b, 16))
    

    from_hex 知道它与哪个类关联,因此通过调用cls(...),您可以构造MyClass 的类型,就好像您自己用有效整数编写了MyClass(a, b)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2017-07-06
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多